Ruby on rails Rails检测请求是否是AJAX

Ruby on rails Rails检测请求是否是AJAX,ruby-on-rails,ajax,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 {redire

在我的操作中,如果它是从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

如果在链接或表单中使用
:remote=>true
,您应该:

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

您还可以通过调用
request.xhr?

在respond\u to block之前进行检查。您可以检查
头[X-request-With]
以查看它是否是AJAX请求。这里有一个关于如何做的好方法

以下是一个例子:

if request.xhr?
  # respond to Ajax request
else
  # respond to normal request
end
更新: 从Rails 6.1.0开始,
xhr?()
实际上(最后)返回一个布尔值


原始答复: 文件上说request.xhr

Returns true if the “X-Requested-With” header contains “XMLHttpRequest”....
但要小心

request.xhr? 
根据=~,返回数值或零值,而不是文档中所说的布尔值

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
所以

文件:


我喜欢在动作前使用
过滤器。当您需要对多个操作进行相同的筛选/授权时,它们特别好

class MyController

如果返回0,则表示它是一个ajax请求,否则它将返回nil

ajax请求不一定要用javascript响应,
$。ajax({dataType:'html'})
是用html响应的ajax。正确的方法是您提到的第二种方法
request.xhr?
truthy和boolean有什么区别?这两个都不是真的/假的吗?真的意思是,当在“布尔”上下文中使用时,您必须将它们视为布尔值,而不是布尔值。上面的env['HTTP_X_REQUESTED_WITH']=~/XMLHttpRequest/返回0非false。0实际上是真实的,在ruby中不是虚假的:0 | | 1=>0,但为了清晰起见,我将更改我的帖子。但是可以说是真实的,0表示文本在索引0处找到,所以它被找到(以及它的和ajax请求)。如果未找到文本,则结果为
nil
,这是错误的。是的,但约定通常用于方法\u名称?返回BOOL,这是一个gotchahawning:这在较新Rails版本中的标准
remote:true
调用上不起作用,因为没有设置必要的头。
env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/  => 0
request.xhr?