Подтвердить что ты не робот

Turbolinks, вызывающий "jquery-ujs, уже загружен!" ошибка

У меня есть новое приложение Rails 4, которое не содержит пользовательский Javascript - папки app/assets/javascripts, lib/assets/javascripts и vendor/assets/javascripts пусты (кроме app/assets/javascripts/application.js).

Когда я нажимаю на приложение, я продолжаю получать ошибку jquery-ujs has already been loaded! в консоли JS. Это происходит каждый раз, когда я нажимаю кнопку "назад", а иногда, когда я нажимаю на обычную ссылку (хотя я не могу сделать это последовательно).

application.js:

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

Когда я удаляю turbolinks из application.js, я перестаю получать ошибку... так что turbolinks оказывается виновником.

Является ли это ошибкой с turbolinks, или я делаю что-то неправильно?

Здесь мой 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

Изменение порядка require в application.js тоже не помогает.

4b9b3361

Ответ 1

Наиболее вероятным объяснением является то, что вы включаете свои скрипты на странице body.

Подробнее см. эту проблему: https://github.com/rails/turbolinks/issues/143

Из turbolinks readme:

Как правило, при переключении на Turbolinks переместите все ваши теги javascript внутри head, а затем перейдите в обратную сторону, только переведя код javascript обратно в тело, если это абсолютно необходимо. Если у вас есть теги script в теле, которые вы не хотите переоценивать, вы можете установить атрибут 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>

Ответ 2

Я столкнулся с той же проблемой, и после нескольких хитов и испытаний я обнаружил, что последовательность файлов javascript имеет значение.

Рабочая последовательность

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

Надеюсь, это решение поможет кому-то.

Ответ 3

Для меня я включил эти написанные дважды, поэтому он загружался дважды. Один раз в application.js //= require jquery и один раз в application.html.erb в качестве тега скрипта.

Ответ 4

Проблема, с которой я столкнулся, заключалась в том, что я дважды скопировал & lt;% = render 'layouts/head'%> !, в голову и в тело. проверьте файл laouts/application.html.erb