使用以下代码:
class TestsController < ApplicationController
skip_before_filter :load_something, # how to skip these only
:load_something_else # if the request is xhr ?
def index
respond_to do |format|
format.html
format.js
end
end
end
根据请求是javascript调用而不更改:load_something
和:load_something_else
方法,有没有办法在过滤器之前跳过?
谢谢!
答案 0 :(得分:38)
尝试使用此行来跳过条件过滤:
skip_before_filter :load_something, :load_something_else,
:if => proc { request.xhr? }
对于ruby-2.0,你也可以使用lambdas(在参数传递中有严格性):
skip_before_filter :load_something, :load_something_else,
if: -> { request.xhr? }
或带参数:
skip_before_filter :load_something, :load_something_else,
if: ->(arg) { request.xhr? && arg }
答案 1 :(得分:20)
以前没有干净的解决方案。假设您无法控制before_filters
(或者不想更改它们),我会离开skip_before_filter
并添加额外的before_filter
,只执行所需的方法{} xhr
方法。
类似
skip_before_filter :load_something, # how to skip these only
:load_something_else # if the request is xhr ?
before_filter :do_loads_if_xhr
def do_loads_if_xhr
if request.xhr?
load_something
load_something_else
end
end
描述的方法here只能起作用,因为条件对于应用程序是全局的:条件仅在创建类时进行评估。不是每个请求。
[增订]
但是,有一种更简洁的方法可以使skip_before_filter
有条件。写得像这样:
skip_before_filter :load_something, :load_something_else, :if => proc {|c| request.xhr?}
另请注意,虽然skip_before_filter
仍然完全受支持且未被弃用,但由于rails 4,文档似乎更喜欢(相同)skip_before_action
。此外,文档对此完全不清楚,必须在代码中进行验证。
答案 2 :(得分:13)
在我看来,所有这些答案都采用了错误的方法。使用带有条件的skip_before_action是向后执行,并且不像将条件添加到before_action本身那样明确和清楚;所以这是我的建议:
before_action :require_password_change, unless: -> { request.xhr? }
这样,对于阅读代码的人,可以立即清楚这个before_action在什么条件下运行或不运行,而不必依赖于在控制器层次结构中某处的skip_before_action中发生这些事件。
答案 3 :(得分:4)
使用alias_method_chain
来装饰过滤器,因此如果请求是xhr,则不会执行它们。
def load_something_with_noxhr(*args)
load_something_without_noxhr(*args) unless request.xhr?
end
alias_method_chain :load_something, :noxhr
(将load_something
更改为所需内容,_with_
和_without_
为文字,后缀noxhr
必须与alias_method_chain
中的第二个参数相同1}}打电话。)
答案 4 :(得分:3)
您编码过滤器了吗?在这种情况下,您可以在其中编写if
子句而不使用skip_before_filter
:
def load_something
unless request.xhr?
#Code
end
end
另一方面,您可以制作自己的过滤器和委托:
before_filter :my_own_filter
def my_own_filter
unless request.xhr?
load_something
load_something_else
end
end
我认为这应该有用。