如果请求是xhr,Rails中有没有办法跳过before_filter?

时间:2011-02-25 07:01:32

标签: ruby-on-rails

使用以下代码:

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方法,有没有办法在过滤器之前跳过?

谢谢!

5 个答案:

答案 0 :(得分:38)

尝试使用此行来跳过条件过滤:

skip_before_filter :load_something, :load_something_else,
   :if => proc { request.xhr? }

对于,你也可以使用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

我认为这应该有用。