2013-12-19 3 views
18

Ich habe ein neueres Rails 4 App, die keine benutzerdefinierte Javascript enthält - die Ordner app/assets/javascripts, lib/assets/javascripts und vendor/assets/javascripts alle leer (außer app/assets/javascripts/application.js) sind.Turbolinks verursachen eine "jquery-ujs wurde bereits geladen!" Fehler

Wenn ich auf die App klicke, bekomme ich den Fehler jquery-ujs has already been loaded! in der JS-Konsole. Es passiert jedes Mal, wenn ich den „Zurück“ Knopf drücken, und manchmal, wenn ich einen normalen Link klicken

application.js (obwohl ich nicht kann es konsequent geschehen.):

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

Wenn Ich entferne Turbolinks von application.js, ich höre auf, den Fehler zu bekommen ... so scheint Turbolinks der Täter zu sein.

Ist das ein Fehler mit Turbolinks oder mache ich etwas falsch?

Hier ist meine Gemfile:

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 

ändern um die Reihenfolge der require s in application.js scheint nicht zu helfen.

Antwort

50

Die wahrscheinlichste Erklärung ist, dass Sie Ihre Skripte auf der Seite body einschließen. nur

Als Faustregel gilt: wenn im Inneren des head zu Turbolinks, bewegen alle Ihre JavaScript-Tags schalten und dann rückwärts arbeiten,:

dieser Ausgabe für mehr: https://github.com/rails/turbolinks/issues/143

Vom turbolinks readme JavaScript-Code zurück in den Körper bewegen, wenn absolut notwendig. Wenn Sie irgendwelche Script-Tags im Körper haben wollen Sie nicht neu bewertet werden, dann können Sie das data-turbolinks-eval Attribut false gesetzt:

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

Verstanden geladen! Ich hatte mein '<% = javascript_include_tag ...%>' vor meinem schließenden '' Tag - das Verschieben innerhalb der '' behob das Problem. Vielen Dank! – GMA

+0

Ich hatte zufällig das Javascript-Tag im Körper eines Layouts. Das hat mich wirklich vermasselt. – thedanotto

6

ich das gleiche Problem konfrontiert und nach einigen Erfolg und Probe tun i fand die Reihenfolge der Javascript-Dateien wichtig.

Der Arbeitsablauf ist

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

Hope, wird diese Lösung jemand helfen.

0

für mich, ich hatte diese zweimal geschrieben enthalten, so wurde es zweimal

<%= javascript_include_tag :application %> <%= javascript_pack_tag 'application' %>

Verwandte Themen