我在我的ApplicationController
中有一个before_filter
,它会应用于项目中的每个控制器。
如何为Devise的SessionsController
的创建操作skip_before_filter
?
我在我的ApplicationController
中有一个before_filter
,它会应用于项目中的每个控制器。
如何为Devise的SessionsController
的创建操作skip_before_filter
?
这是我同事刚教给我的一个方法:
# In config/application.rb
module YourAppNameHere
class Application < Rails::Application
# Whatever else is already here...
# The part to add
config.to_prepare do
Devise::SessionsController.skip_before_filter :your_before_filter_here
end
end
end
skip_before_filter :check_subdomain!, if: :devise_controller?
Rails >= 4
skip_before_action :check_subdomain!, if: :devise_controller?
我们做了类似于这样的事情:
首先,创建你自己的会话控制器,确保正确继承:
class SessionsController < Devise::SessionsController
skip_before_filter :foobar
然后修复路由。devise_for :users,
:controllers => {
:sessions => "sessions"
}
或者,您可以对Devise的会话控制器进行猴子补丁。
module DeviseSessionsControllerDecorator
extend ActiveSupport::Concern
included do
skip_before_filter :your_filter_name
end
end
Devise::SessionsController.send(:include, DeviseSessionsControllerDecorator)
在开发模式下,类不会被缓存,因此您可能需要将以下内容添加到 config/environments/development.rb 文件中:
config.to_prepare do
Devise::SessionsController.send(:include, DeviseSessionsControllerDecorator)
end
if params[:controller] != 'devise/sessions'
在我的同事向我展示了我在另一个答案中发布的方法之前,我做了这件事。我发帖是为了让你认为它更简单。
class ApplicationController < ActionController::Base
# ...
before_filter :do_something
def do_something
unless params[:controller] == 'devise/sessions'
# ...
end
end
end
尝试用 unless 块包装 before_filter,并通过 params[:controller]
进行过滤
def some_before_action
unless params[:controller] == "sessions_controller_for_devise_name"
... #=> do the stuff here
end
end
只需授权应使用前置过滤器的操作。
before_filter :action, :only => ...
并授权您的其他人员。
Devise::SessionsController
替换为DeviseTokenAuth::SessionsController
,它就非常出色地工作了! - Vlad SabevDevise :: SessionsController.skip_before_filter:check_toc,only:[:new]
。 - James Hibbard