javascript - rails - turbolinks callbacks
Turbolinks causando un error "jquery-ujs ya se ha cargado!" (3)
Tengo una nueva aplicación Rails 4 que no contiene Javascript personalizado: las carpetas app/assets/javascripts
, lib/assets/javascripts
y vendor/assets/javascripts
están vacías (aparte de app/assets/javascripts/application.js
).
Cuando hago clic alrededor de la aplicación, sigo recibiendo el error ¡ jquery-ujs has already been loaded!
en la consola js. Ocurre cada vez que presiono el botón "atrás", y algunas veces cuando hago clic en un enlace normal (aunque no puedo hacer que suceda de manera consistente).
aplicacion.js:
//= require jquery
//= require jquery_ujs
//= require twitter/bootstrap
//= require turbolinks
//= require_tree .
Cuando quito turbolinks de application.js, dejo de recibir el error ... por lo que turbolinks parece ser el culpable.
¿Es esto un error con turbolinks, o estoy haciendo algo mal?
Aquí está mi 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
Cambiar alrededor del orden de los require
en application.js tampoco parece ayudar.
La explicación más probable es que está incluyendo sus scripts en el body
la página.
Vea este tema para más información: https://github.com/rails/turbolinks/issues/143
De los turbolinks readme :
Como regla general cuando cambie a Turbolinks, mueva todas sus etiquetas javascript dentro de la
head
y luego trabaje hacia atrás, solo mueva el código javascript hacia el cuerpo si es absolutamente necesario. Si tiene etiquetas de secuencia de comandos en el cuerpo que no desea volver a evaluar, puede establecer el atributodata-turbolinks-eval
enfalse
:
<script type="text/javascript" data-turbolinks-eval=false>
console.log("I''m only run once on the initial page load");
</script>
Me enfrenté al mismo problema y, después de realizar algunos intentos y pruebas, encontré que la secuencia de archivos javascript es importante.
La secuencia de trabajo es
//= require jquery
//= require jquery_ujs
//= require jquery.turbolinks
//= require turbolinks
Espero, esta solución ayudará a alguien.
Para mí, había incluido estos escritos dos veces, así que se estaba cargando dos veces. Una vez en application.js //= require jquery
y una vez en application.html.erb como etiqueta de script.