Rails 4:Turbolinks 发送请求两次并重新加载页面

Arp*_*nav 3 javascript ruby ajax turbolinks ruby-on-rails-4.1

我正在使用 Rails 4.1.1 和 Ruby 2.1.0 开发 Ruby on Rails 应用程序。

我已将应用程序设置为使用 Turbolinks,这会导致 AJAX 链接出现问题。当我单击调用 AJAX 函数的链接时,会发生三件事:
1. 进行 AJAX 调用
2. 重新加载相同的链接
3. 应用程序服务器运行所有请求两次。

如何使这些链接作为标准的 AJAX 链接运行?

作为参考,这是我的相关部分GemFile

gem 'turbolinks'
gem 'jquery-turbolinks'
Run Code Online (Sandbox Code Playgroud)

以下是我在 中包含 JavaScript 库的方式application.js

//= require jquery
//= require jquery.turbolinks
//= require jquery_ujs
//= require turbolinks
Run Code Online (Sandbox Code Playgroud)

这是我在应用程序布局中包含 JavaScript 文件的方式:

<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
Run Code Online (Sandbox Code Playgroud)

Osc*_*ang 8

可能有3个原因:

  • 您对该请求的响应状态介于 400 到 600 之间
  • 您的回复内容类型不匹配 /^(?:text\/html|application\/xhtml\+xml|application\/xml)(?:;|$)/
  • 资产已在新页面中更改。例如,您在包含另一个 js 的不同布局中呈现新页面。当data-turbolinks-track为 true 时,turbolinks 会刷新。

这三个原因可以从下面的源代码中得到。当响应给出文档正文时,它会显示它,或者它会刷新页面。

fetchReplacement = (url, onLoadFunction, showProgressBar = true) ->
  ...
  xhr.onload = ->
    triggerEvent EVENTS.RECEIVE, url: url.absolute
    if doc = processResponse()
      reflectNewUrl url
      reflectRedirectedUrl()
      changePage extractTitleAndBody(doc)...
      manuallyTriggerHashChangeForFirefox()
      onLoadFunction?()
      triggerEvent EVENTS.LOAD
    else
      document.location.href = crossOriginRedirect() or url.absolute

processResponse = ->
  clientOrServerError = ->
    400 <= xhr.status < 600

  validContent = ->
    (contentType = xhr.getResponseHeader('Content-Type'))? and
      contentType.match /^(?:text\/html|application\/xhtml\+xml|application\/xml)(?:;|$)/

  ...

  //here is the check
  if not clientOrServerError() and validContent()
    doc = createDocument xhr.responseText
    if doc and !assetsChanged doc
      return doc
Run Code Online (Sandbox Code Playgroud)