Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Почему хелпер “devise_controller?” возвращает false для моего кода?

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

Комментариев нет:

Отправить комментарий