false for the following code:
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
while in the browser line go to " http://127.0.0.1:3000/admin/review "
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
while for the rest of the get 'admin/show' and get 'admin/upload' routes, the helper returns true ….
In general, the problem was solved in this way. Added filter to
before_filter :my_filter, unless: :devise_controller? def my_filter if params['controller'] == 'admin' render layout: "admin" end end
But the question essentially remains – why does the same thing work with failures through
devise_controller? only checks if your class is inherited from the
def devise_controller? is_a?(::DeviseController) end
Your controller inherits from
ActionController::Base , so the condition may not always be met. To check the fact of authentication, it is better to use the Devise helpers:
current_user . If you need to change the layout regardless of whether the user is authenticated or not – just change it in render (as you actually did in Update).