Turbolinks导致“jquery-ujs已被加载!”错误

时间:2013-12-19 14:56:30

标签: javascript jquery ruby-on-rails turbolinks

我有一个新的Rails 4应用程序,其中包含 no 自定义Javascript - 文件夹app/assets/javascriptslib/assets/javascriptsvendor/assets/javascripts都是空的(除了{{ 1}})。

当我点击应用程序时,我不断在JS控制台中收到错误app/assets/javascripts/application.js。每次我点击“后退”按钮时都会发生这种情况,有时当我点击一个普通链接时(虽然我无法让它始终如一地发生)。

的application.js:

jquery-ujs has already been loaded!

当我从application.js中删除turbolink时,我不再收到错误了...所以turbolinks似乎是罪魁祸首。

这是turbolinks的错误,还是我做错了什么?

这是我的Gemfile:

//= require jquery
//= require jquery_ujs
//= require twitter/bootstrap
//= require turbolinks
//= require_tree .

在application.js中改变source 'https://rubygems.org' ruby '2.0.0' gem 'rails', '4.0.0' gem 'active_model_serializers' gem 'aws-sdk' gem 'bootstrap-sass-rails' gem 'coffee-script-source', '1.5.0' gem 'coffee-rails', '~> 4.0.0' gem 'devise' gem 'factory_girl_rails', '4.1.0' gem 'figaro' gem 'font-awesome-sass-rails' gem 'jbuilder', '~> 1.2' gem 'jquery-rails' gem 'paperclip' gem 'paperclip-meta', github: 'y8/paperclip-meta' gem 'pg' gem 'sass-rails', '~> 4.0.0' gem 'turbolinks' gem 'uglifier', '>= 1.3.0' group :production do gem 'rails_12factor' end group :doc do gem 'sdoc', require: false end group :test do gem 'capybara', '2.1.0' end group :development, :test do gem 'childprocess', '0.3.9' gem 'debugger' gem 'faker', '~> 1.2.0' gem 'json_spec' gem 'rspec-rails' gem 'rspec-mocks' end group :development do gem 'annotate' gem 'hirb' gem 'wirb' end 的顺序似乎也没有帮助。

4 个答案:

答案 0 :(得分:54)

最可能的解释是,您在页面body中加入了脚本

有关详情,请参阅此问题:https://github.com/rails/turbolinks/issues/143

来自turbolinks readme

  

根据经验,切换到Turbolinks时,将所有javascript标记移到head内,然后向后工作,只有在绝对必要时才将javascript代码移回正文。如果您在身体中有任何脚本标记,则不希望重新评估,那么您可以将data-turbolinks-eval属性设置为false

<script type="text/javascript" data-turbolinks-eval=false>
  console.log("I'm only run once on the initial page load");
</script>

答案 1 :(得分:6)

我遇到了同样的问题,经过一些点击和试验后,我发现javascript文件的顺序很重要。

工作顺序是

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

希望,这个解决方案可以帮助别人。

答案 2 :(得分:1)

对我来说,我已经把这些书面写了两次,所以它加载了两次。一旦进入application.js setDefault(true),一次进入application.html.erb作为脚本标记。

答案 3 :(得分:0)

我遇到的问题是我在头部和身体中两次复制了<%= render'layouts / head'%> !!检查laouts / application.html.erb文件