如何跳过 Devise SessionsController 中的 before_filter?

21

我在我的ApplicationController中有一个before_filter,它会应用于项目中的每个控制器。

如何为Devise的SessionsController的创建操作skip_before_filter

7个回答

65

这是我同事刚教给我的一个方法:

# 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

1
我正在使用devise_token_auth gem,我只需要将Devise::SessionsController替换为DeviseTokenAuth::SessionsController,它就非常出色地工作了! - Vlad Sabev
另外,我想提醒您必须添加所有要跳过的Devise控制器,例如Devise :: PasswordsController,Devise :: RegistrationsController。 - user1136228
@NathanLong 谢谢 - 我只想跳过会话控制器中的新操作 - 您的答案将如何更改以反映此附加要求? - BenKoshy
@BKSpurgeon 我写下这个答案已经有5年了 - 我已经不记得当时的背景了。 :) 或许你可以尝试提出一个新问题? - Nathan Long
1
@BKSpurgeon,你可以使用Devise :: SessionsController.skip_before_filter:check_toc,only:[:new] - James Hibbard
显示剩余3条评论

25
我最近在我的application_controller中遇到了关于过滤器的问题,我通过使用skip_before_filter解决了这个问题。
Rails < 4
skip_before_filter :check_subdomain!, if: :devise_controller?

Rails >= 4

skip_before_action :check_subdomain!, if: :devise_controller?

1
跳过动作:check_subdomain!,如果:devise_controller? - Chris Hobbs

17

我们做了类似于这样的事情:

首先,创建你自己的会话控制器,确保正确继承:

class SessionsController < Devise::SessionsController
  skip_before_filter :foobar
然后修复路由。
devise_for :users,
  :controllers => {
    :sessions => "sessions"
  }

或者,您可以对Devise的会话控制器进行猴子补丁。


这听起来是一个不错的方法,但我无法让它工作 :/ - Spyros
我发现这个解决方案比更多赞的解决方案更“干净”。它将控制器逻辑保留在控制器中。 - Chambeur

2
在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

1
你可以在筛选方法中检查它是否为设备控制器。
  if params[:controller] != 'devise/sessions'

1

在我的同事向我展示了我在另一个答案中发布的方法之前,我做了这件事。我发帖是为了让你认为它更简单。

class ApplicationController < ActionController::Base
  # ...
  before_filter :do_something

  def do_something
    unless params[:controller] == 'devise/sessions'
      # ...
    end
  end
end

0

新答案

尝试用 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 => ...

并授权您的其他人员。

在这里找到了此信息


我知道这个,但是为了让它像这样工作,你需要把它放在sessions控制器中。那是devise gem的控制器。这绝对不是一个好主意 :/ - Spyros
你可以使用 :only => 来过滤你想要的吗? - Paul Kaplan
修改了答案,如果在应用控制器中可用,则使用params[:controller],这样可以行得通吗? - Paul Kaplan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接