指定要从 before_filter 中排除哪些控制器

38

我正在使用devise进行身份验证,并在我的应用程序控制器中添加了一些before_filters。 我遇到的问题是,当我尝试注销时,before_filter拦截并使我停留在我在before_filter中设置的视图上。 有没有办法指定哪些控制器应该从应用程序控制器中排除或从其他文件中排除?

4个回答

104

如果您想跳过继承控制器中指定的before filter,请在您希望跳过该filter的控制器中告诉Rails跳过该filter。

class ApplicationController
  before_filter :authenticate_user!
end

class SessionsController < ApplicationController
  skip_before_filter :authenticate_user!
end

2
这更清晰地回答了原始问题,但是来自被接受的答案的 skip_before_filter :filter-name, :except => [:action1, :action2] 是一个很好的提示! - colsen
@Jesse Wolgamott如果我想跳过before filter的控制器位于一个gem中,有没有办法在before_filter本身上指定更多的内容,而不仅仅是actions? - hunteros
@hunteros - 你可能需要在你的代码中重新打开类,然后添加跳过过滤器。 - Jesse Wolgamott
@JesseWolgamott 我本来希望不必这样做,但我想那可能是唯一的解决方案。在代码库中重新打开控制器类的位置是否有约定俗成的规则? - hunteros

79

你可以使用:only:except来过滤筛选。

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

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

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

12

3

以上的回答都很好,但是有一点需要注意:

DEPRECATION WARNING: skip_before_filter即将过时,并将在 Rails 5.1 中被移除。请使用skip_before_action代替。

因此请使用before_actionskip_before_action来代替*-filter


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