#ruby_on_rails #devise
Почему хелпер devise_controller? возвращает false для следующего кода: class ApplicationController < ActionController::Base protect_from_forgery with: :exception layout :resource protected def resource if devise_controller? #"admin" puts "admin" else #"application" puts "app" end end end при этом в строке браузера переход на "http://127.0.0.1:3000/admin/review" файл routes.rb: Rails.application.routes.draw do get 'admin/show' get 'admin/upload' get 'admin/review' get 'welcome/index' get 'welcome/portfolio' get 'welcome/about' get 'welcome/contact' get 'welcome/blog' get 'welcome/review' end при этом для остальных маршрутов get 'admin/show'и get 'admin/upload' хелпер выдает true .... Обновление В общем проблему решил так. Добавил в ApplicationController фильтр before_filter :my_filter, unless: :devise_controller? def my_filter if params['controller'] == 'admin' render layout: "admin" end end Но вопрос по существу остается - почему через layout тоже самое со сбоями работает?
Ответы
Ответ 1
Метод devise_controller? лишь проверяет унаследован ли ваш класс от класса DeviseController def devise_controller? is_a?(::DeviseController) end У вас контроллер наследуется от ActionController::Base, поэтому условие не всегда может быть выполнено. Для проверки факта аутентификации лучше воспользоваться хелперами Devise: user_signed_in? и current_user. Если вам нужно сменить layout не зависимо от того, аутентифицирован пользователь или нет - просто меняйте его в render (как вы собственно и поступили в Обновлении).
Комментариев нет:
Отправить комментарий