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

Javascript_include_tag Rails 4 генерирует "/javascripts/" вместо "/assets" в производстве

У меня есть приложение Rails 4 с

<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %>

в голове. В процессе разработки отображается следующий HTML-код и загружается modernizr:

<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script>

В процессе производства выводится HTML-код, а modernizr не загружается (404 не найдено):

<script data-turbolinks-track="true" src="/javascripts/modernizr.js"></script>

В процессе производства /assets/modernizr.js найден и доступен для просмотра.

Документация Rails говорит, что javascript_include_tag должен генерировать

<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script>

В процессе создания my stylesheet_link_tag в порядке, ссылаясь на каталог /assets/.

Почему привязка javascript_include_tag к /javascripts вместо /assets в процессе производства и как ее исправить?

4b9b3361

Ответ 1

Один из операторов использования для AssetUrlHelper указывает, что он будет создавать /javascripts/urls как вы видите:

# asset_path "application", введите:: javascript # = > /javascripts/application.js

(from asset_url_helper.rb строка 117 - [1])

Этот код выглядит так, как будто он может быть достигнут, если отсутствует прекомпилированный актив так что кажется, что компиляция вашего актива не работает (обычно мои развертывания сбой, когда это произойдет, так что, возможно, ваш даже не стреляет).

Тот же asset_url_helper.rb вызывает /javascripts/part 'extname' и использует следующую карту, чтобы узнать, как сгенерировать имя:

 # Maps asset types to public directory.
  ASSET_PUBLIC_DIRECTORIES = {
    audio:      '/audios',
    font:       '/fonts',
    image:      '/images',
    javascript: '/javascripts',
    stylesheet: '/stylesheets',
    video:      '/videos'
  }

Новое приложение Rails 4 имеет это в config/environment/production.rb

  # Do not fallback to assets pipeline if a precompiled asset is missed.
  config.assets.compile = false

который, похоже, соответствует поведению, которое вы видите.

Ответ 2

По умолчанию Rails только прекомпилирует application.js, application.css и любые изображения, найденные в пути к ресурсам. Поэтому в производстве mordernizr не будет предварительно скомпилирован, и поэтому помощники javascript не смогут найти файл.

Чтобы исправить эту проблему, вы можете добавить modernizr в список прекомпиляции, изменив следующую конфигурацию в production.rb

config.assets.precompile += ['modernizr.js']

Для получения дополнительной информации см. Rails Guides

Ответ 3

Обязательно предварительно скомпилируйте свои активы в процессе производства, выполнив следующую команду:

RAILS_ENV=production bundle exec rake assets:precompile

Руководство Rails в конвейере активов может предоставить вам более подробную информацию: http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets

Ответ 4

У меня есть новое приложение, использующее Rails 4, развернутое на Heroku, с помощью:

<%= javascript_include_tag "application", "data-turbolinks-track" => true %>

мое приложение javascript. (отпечаток пальца).js, вызванный из src: assets/application.js

Я думаю, что ваша проблема исходит из чего-то в вашем production.rb, который определяет активы из другого места.

Так что, возможно, вы можете добавить Moderniz.js в

config.assets.precompile = ['.js', '.css', '*.css.erb']

в config/production.rb

Или просто попробуйте модернизировать script в application.js

//= требуется mordernizr

и удалите вызов modernizr script в ваш макет.

<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %>

Вы можете проверить, где ваш application.js подан в вашу производственную среду?

Ответ 5

Возможно, это связано с тем, что этот файл должен быть в /vendor/assets/javascript вместо/app/assets/javascript. Папка Vendor предназначена для библиотек javascript, а папка App - для вашего кода.

Лучшим решением, чем добавление тега в ваш макет, будет добавление ссылки script на ваш application.js, и пусть компилятор sass сжимает и присоединяет его к основному файлу javascript.

Если вы не получите окончательного ответа, проверьте: http://guides.rubyonrails.org/asset_pipeline.html#asset-organization