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

时间:2014-10-10 08:01:10

标签: javascript ruby ajax ruby-on-rails-4.1 turbolinks

我正在使用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'

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

//= require jquery
//= require jquery.turbolinks
//= require jquery_ujs
//= require turbolinks

以下是我在应用程序布局中包含JavaScript文件的方法:

<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>

2 个答案:

答案 0 :(得分:4)

可能有三个原因:

  • 您对该请求的回复状态介于400和600之间
  • 您的回复内容类型与/^(?:text\/html|application\/xhtml\+xml|application\/xml)(?:;|$)/
  • 不符
  • 新页面中的资产已更改。 例如,您以不同的布局呈现新页面,其中包含另一个js。如果data-turbolinks-track为真,则turbolink会进行更新。

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

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

答案 1 :(得分:-1)

尝试在表单中使用:onsubmit => "false",然后使用点击功能运行提交。