Rails 检测 request 是否是 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
73083 次浏览

如果你在你的链接或表单中使用 :remote => true,你应该这样做:

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

还可以通过调用 request.xhr?在 response _ to 块之前进行检查。

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

这里有一个例子:

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

更新:

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

Https://github.com/rails/rails/commit/0196551e6039ca864d1eee1e01819fcae12c1dc9#diff-60b77e427ea7ba142faa477fac10b8d0134cede4e35a3b1953c425200fadf1acl267-l269


原答案:

医生说是这个要求?

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

我喜欢使用 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
request.xhr?

如果返回0,那么它意味着它是一个 ajax 请求,否则它将返回0

如果您在链接、表单中使用 :remote => true,那么您的响应将以 js 的形式而不是 HTML、 JSON 等。

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


respond_to do |format|
format.js
if (wasAJAXRequest()) #How do I do this?


format.html #action.html.erb


else


format.html {redirect_to root_url}
end
end
end

您还需要创建,动作适当的 js 文件,在您的情况下,动作名称是动作,因此文件名将是-action.js.erb。也转移我们的行动代码内的 action.js.erb文件