Rails 3.1 с Asset Pipeline, сообщение link_to:confirm отображается дважды?

Итак, я видел этот вопрос об этой проблеме, вызванной несколькими ссылки на jQuery или Prototype, но я могу подтвердить, что ссылаюсь на jQuery один раз на всей странице. Моя проблема заключается в следующем: когда у меня есть link_to, подтверждающий удаление, всплывающее окно отображается дважды. Вот применимый код в моем шаблоне (написанном в Slim):

link_to('Destroy', depot_path(@depot.id), :confirm => "Really?", :method => :delete)

Я запускаю Rails 3.1.0 с включенным конвейером ресурсов, с gem 'jquery-rails' в моем Gemfile, а следующее находится в моем файле application.js (который скомпилирован Sprockets для конвейера ресурсов).

//= require jquery
//= require jquery_ujs
//= require 'underscore'
//= require 'backbone' 

У меня есть underscore.js и backbone.js в моем каталоге /vendor/assets/javascripts/, и звездочки, кажется, находят их в порядке. Я также просмотрел файл application.js, который обслуживает sprockets, и jQuery находится там только один раз, а jQuery UJS - только один раз. Вот как выглядит моя голова при отображении моей страницы (я пропустил значение csrf-token для отображения, FWIW).

<head>
  <meta content="text/html; charset=utf-8" http-equiv="content-type">
  <title>Administration</title>
  <link href="/assets/screen.css" media="screen" rel="stylesheet" type="text/css" />
  <script src="/assets/application.js" type="text/javascript"></script>
  <meta content="authenticity_token" name="csrf-param" />
  <meta content="--token--omitted--" name="csrf-token" />
  <script src="/assets/common/subdata.js" type="text/javascript"></script>
  <link href="/assets/show.css" media="screen" rel="stylesheet" type="text/css" />
</head>

subdata.js содержит код, специфичный для Backbone; ничего, что могло бы снова включить jQuery. Так в чем же дело? В моем проекте нет дополнительного файла jQuery; все это управляется через гем jquery-rails. Что заставляет мой метод :confirm срабатывать дважды?

EDIT: раньше я видел это на RC5 Rails 3.1, но теперь я также вижу это на Rails 3.1.


person Ben Kreeger    schedule 16.08.2011    source источник


Ответы (4)


Это произошло со мной, потому что я запустил rake assets:precompile в своей среде разработки, что привело к созданию public/assets/application.js. Это заставляет запросы на /assets/application.js обслуживаться этим статическим файлом, который содержит все // require скрипты в public/assets/application.js, скомпилированные вместе, вызывая их повторную загрузку.

В режиме разработки <%= javascript_include_tag "application" %> будет расширяться до нескольких тегов <script>, по одному для каждого файла, требуемого // require строками, а также по одному для application.js, которые содержат только собственное содержимое.

Решение состоит в том, чтобы вручную удалить весь каталог public/assets или использовать задачу assets:clean rake. Это приведет к тому, что файлы сценариев будут снова обслуживаться динамически.

person Mattias Wadman    schedule 28.11.2011
comment
Я использую Rails 3.0.10, и это случилось со мной после установки драгоценного камня jquery-rails и запуска его генератора. Rails.js не был удален, и удаление этого исправлено. - person PhillipKregg; 11.02.2012
comment
Пришло время принять это как ответ — это сработало лучше всего для меня. Также обратите внимание, что запуск bundle exec rake assets:clean будет работать для удаления каталога public/assets. Большая часть всего этого была связана с тем, что я до сих пор не писал и не хранил свои таблицы стилей с наименьшими трениями, как того требует конвейер активов. Вот что я получаю за то, что пытаюсь быть другим, наверное… - person Ben Kreeger; 23.02.2012
comment
Спасибо. Не знал о assets:clean, приятно знать. Похоже, нужно сделать более или менее одно и то же но выглядит правильнее. - person Mattias Wadman; 24.02.2012

Это происходило и со мной. Удаление "//= require_tree ." из application.js исправил это.

person kidcapital    schedule 07.11.2011
comment
Это может привести к тому, что вы дважды включаете один и тот же файл вручную с помощью javascript_include_tag, а другой — с помощью application.js. Сначала подтвердите, что в этом случае вы должны включить его один раз. - person Taimoor Changaiz; 21.05.2013

Упомяните имя jquery и jquery_ujs с версией в application.js, если все еще не работаете, возьмите сжатую версию jquery и jquery_ujs.

or

Добавьте gem 'jquery-rails' в свой gemfile, а затем попробуйте.

person Rameshwar Vyevhare    schedule 24.11.2011
comment
Драгоценный камень jquery-rails уже был в моем Gemfile (как указано в моем вопросе). Удаление jquery и jquery_ujs полностью удалило все поведение представления Rails/jQuery. - person Ben Kreeger; 23.02.2012

Вероятно, у вас есть файл rails.js. Удалите его и попробуйте еще раз. Это должно работать.

FoN

person Alfonso García    schedule 04.10.2011
comment
У меня нет файла rails.js в моем проекте; ни в app/assets/javascripts, ни в public/javascripts, нигде. Также нет ссылок или неработающих ссылок на какой-либо rails.js файл. - person Ben Kreeger; 05.10.2011