【问题标题】:Specify which controllers to exclude from before_filter指定要从 before_filter 中排除的控制器
【发布时间】:2011-08-26 02:06:44
【问题描述】:

我正在使用设计进行身份验证,并且在我的应用程序控制器中有一些 before_filters。我看到的问题是,当我尝试注销 before_filter 时会拦截它并使我保持在我在 before_filter 中设置的视图上。我有什么方法可以指定应从应用程序控制器或其他文件中排除哪些控制器?

【问题讨论】:

    标签: ruby-on-rails devise before-filter


    【解决方案1】:

    在要跳过继承控制器中指定的前置过滤器的控制器中,您可以告诉 rails 跳过过滤器

    class ApplicationController
      before_filter :authenticate_user!
    end
    
    class SessionsController < ApplicationController
      skip_before_filter :authenticate_user!
    end
    

    【讨论】:

    • 这以更清晰的方式给出了原始问题的答案,但是来自接受的答案的skip_before_filter :filter-name, :except =&gt; [:action1, :action2] 是一个很好的提示!
    • @Jesse Wolgamott 如果我想跳过前置过滤器的控制器位于 gem 中怎么办?有没有办法在 before_filter 本身上指定不仅仅是操作?
    • @hunteros - 您可能需要在代码中重新打开该类,然后添加跳过过滤器
    • @JesseWolgamott 我希望我不必这样做,但认为这是唯一的解决方案。是否有关于我应该在代码库中的何处重新打开控制器类的约定?
    【解决方案2】:

    您可以使用:only:except 限定过滤器。

    before_filter :filter_name, :except => [:action1, :action2]
    

    或者如果过滤器(我现在看到的情况就是您的情况)在ApplicationController 中定义并且您想在子类控制器中绕过它,您可以在子类中使用具有相同资格的skip_before_filter控制器:

    skip_before_filter :filter_name, :except => [:action1, :action2]
    

    【讨论】:

      【解决方案3】:

      在 config/application.rb 中

      config.to_prepare do
        Devise::SessionsController.skip_before_filter :authenticate_user!
      end
      

      引用者:

      How to skip a before_filter for Devise's SessionsController?

      【讨论】:

        【解决方案4】:

        上面的答案很好,除了: DEPRECATION WARNING: skip_before_filter is deprecated and will be removed in Rails 5.1. Use skip_before_action instead.

        所以请使用before_actionskip_before_action 而不是*-filter

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-27
          相关资源
          最近更新 更多