Answers:
您可以检查是否为header[X-Requested-With]
AJAX请求。这是一篇很好的文章。
这是一个例子:
if request.xhr?
# respond to Ajax request
else
# respond to normal request
end
如果要:remote => true
在链接或表单中使用,请执行以下操作:
respond_to do |format|
format.js { #Do some stuff }
您还可以通过调用来在response_to块之前进行检查request.xhr?
。
$.ajax({dataType: 'html'})
而是一个使用HTML响应的ajax。正确的方法是您提到的第二个方法request.xhr?
文档说那个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
nil
,这是错误的。
我喜欢使用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
remote: true
在较新的Rails版本中,这不适用于标准调用,因为未设置必要的标头。