Rails检测请求是否是AJAX

Raz*_*orm 123 ajax ruby-on-rails

在我的操作中,我希望只响应处理,如果它是从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
Run Code Online (Sandbox Code Playgroud)

Ami*_*far 245

您可以检查header[X-Requested-With]是否是AJAX请求.这是一篇关于如何做的好文章.

这是一个例子:

if request.xhr?
  # respond to Ajax request
else
  # respond to normal request
end
Run Code Online (Sandbox Code Playgroud)

  • 警告:这不适用于较新 Rails 版本中的标准“remote: true”调用,因为未设置必要的标头。 (2认同)

Sea*_*ill 14

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

respond_to do |format|
  format.js { #Do some stuff }
Run Code Online (Sandbox Code Playgroud)

您还可以通过调用在respond_to块之前进行检查request.xhr?.

  • ajax请求不一定要用javascript响应,`$ .ajax({dataType:'html'})`是用HTML响应的ajax.正确的方法是你提到的第二个`request.xhr?` (26认同)

pix*_*rth 5

更新:

从 Rails 6.1.0 开始,xhr?()实际上(最终)返回一个布尔值。

https://github.com/rails/rails/commit/0196551e6039ca864d1eee1e01819fcae12c1dc9#diff-60b77e427ea7ba142faa477fac10b8d0134cede4e35a3b1922035a3b1926L2003


原答案:

文档说 request.xhr?

Returns true if the “X-Requested-With” header contains “XMLHttpRequest”....
Run Code Online (Sandbox Code Playgroud)

但请注意

request.xhr? 
Run Code Online (Sandbox Code Playgroud)

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

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

它基于此:

# File actionpack/lib/action_dispatch/http/request.rb, line 220
def xml_http_request?
  @env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/
end
Run Code Online (Sandbox Code Playgroud)

所以

env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/  => 0
Run Code Online (Sandbox Code Playgroud)

文档:

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

  • 是的,但约定通常用于 method_name?返回 BOOL,所以这是一个问题 (3认同)