Rails检测请求是否是AJAX

时间:2011-11-22 01:01:30

标签: ruby-on-rails ajax

在我的操作中,我希望只响应处理,如果它是从AJAX请求中调用的。我该如何检查?

我想做这样的事情:

def action
   @model = Model.find(params[:id])

   respond_to do |format|

      if (wasAJAXRequest()) #How do I do this?

         format.html #action.html.erb

      else

         format.html {redirect_to root_url}
   end
end

5 个答案:

答案 0 :(得分:241)

您可以检查header[X-Requested-With]以查看它是否是AJAX请求。这是一个很好的article如何做到这一点。

以下是一个例子:

if request.xhr?
  # respond to Ajax request
else
  # respond to normal request
end

答案 1 :(得分:15)

如果您在链接或表单中使用:remote => true,则可以执行以下操作:

respond_to do |format|
  format.js { #Do some stuff }

您还可以通过调用request.xhr?来确认在respond_to阻止之前。

答案 2 :(得分:3)

文档说request.xhr?

Returns true if the “X-Requested-With” header contains “XMLHttpRequest”....

但请注意

request.xhr? 
根据=〜,

返回数字或nil值,而不是文档所说的BOOLEAN值。

irb(main):004:0> /hay/ =~ 'haystack'
=> 0
irb(main):006:0> /stack/ =~ 'haystack'
=> 3
irb(main):005:0> /asfd/ =~ 'haystack'
=> nil

基于此:

# File actionpack/lib/action_dispatch/http/request.rb, line 220
def xml_http_request?
  @env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/
end

所以

env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/  => 0

文档:

http://apidock.com/rails/v4.2.1/ActionDispatch/Request/xml_http_request%3F

答案 3 :(得分:0)

我喜欢使用before_action过滤器。当您需要对多个操作使用相同的过滤器/授权时,它们特别好。

class MyController < AuthController
  before_action :require_xhr_request, only: [:action, :action_2]

  def action
    @model = Model.find(params[:id])
  end

  def action_2
    # load resource(s)
  end

  private

  def require_xhr_request
    redirect_to(root_url) unless request.xhr?
  end
end

答案 4 :(得分:0)

request.xhr? 

如果此返回0,则表示其为ajax请求,否则将返回nil