【发布时间】:2011-06-02 02:03:35
【问题描述】:
我的ApplicationController 中有一个before_filter;也就是说,对于我项目中的每个控制器。
我如何 skip_before_filter 为 Devise 的 SessionsController 创建操作?
【问题讨论】:
标签: ruby-on-rails devise before-filter
我的ApplicationController 中有一个before_filter;也就是说,对于我项目中的每个控制器。
我如何 skip_before_filter 为 Devise 的 SessionsController 创建操作?
【问题讨论】:
标签: ruby-on-rails devise 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
【讨论】:
to_prepare 块对你来说会这么慢,但仅供参考,根据 Rails 指南,这样的块“将在开发中的每个请求上运行,但是在生产和测试中只有一次(在启动期间)。”
Devise::SessionsController 替换为DeviseTokenAuth::SessionsController,效果非常好!
Devise::SessionsController.skip_before_filter :check_toc, only: [:new]
我最近在我的application_controller 中遇到了这个过滤器问题,我使用skip_before_filter 解决了这个问题
skip_before_filter :check_subdomain!, if: :devise_controller?
【讨论】:
我们做了这样的事情:
首先,创建你自己的会话控制器,确保正确继承:
class SessionsController < Devise::SessionsController
skip_before_filter :foobar
然后修复路线
devise_for :users,
:controllers => {
:sessions => "sessions"
}
或者,您可以对 Devise 的会话控制器进行猴子补丁。
【讨论】:
这是 lib/devise_sessions_controller_decorator.rb 中的另一种方式:
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
【讨论】:
在我的同事向我展示我在其他答案中发布的方式之前,我已经这样做了。如果您认为它更简单,我会发布此内容。
class ApplicationController < ActionController::Base
# ...
before_filter :do_something
def do_something
unless params[:controller] == 'devise/sessions'
# ...
end
end
end
【讨论】:
您可以简单地检查您的过滤方法是否是设计控制器。
if params[:controller] != 'devise/sessions'
【讨论】:
如何将 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 => ...
并授权你的其他人。
【讨论】: