#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 (как вы собственно и поступили в Обновлении).
Комментариев нет:
Отправить комментарий