Rails 4: запуск приложения в производственном режиме после того, как предварительная компиляция ресурсов выдает проблему с не найденными активами

Пользуюсь рельсами 4.1.8

В файле production.rb у меня есть следующее:

  config.eager_load = false
  config.cache_classes = false
  config.consider_all_requests_local       = true
  config.action_controller.perform_caching = true
  config.serve_static_assets = true
  config.assets.js_compressor = :uglifier
  config.assets.compile = false
  config.assets.digest = false
  config.assets.debug = true

Теперь после запуска RAILS_ENV=production rake assets:precompile он предварительно компилирует все ресурсы и сохраняет их в папке public / assets с именем файла application-ca4ad5e0582927b0a78c2b6feef3309b.js.

после запуска приложения в производственной среде на моем локальном компьютере возникает ошибка

ActionController::RoutingError (No route matches [GET] "/assets/application.js"):

Я попытался изменить значения config.serve_static_assets и других .. но все еще сталкивался с той же проблемой.

Предварительно скомпилированные файлы сохраняются со значениями дайджеста в их имени, например: application-ca4ad5e0582927b0a78c2b6feef3309b.js, но доступны как application.js, это вызывает основную проблему.

Любые предложения здесь ?? Спасибо..


person Swati    schedule 11.05.2015    source источник


Ответы (4)


Обратитесь к этому обсуждению здесь - Большая часть моих активы внезапно возвращают 404 после нажатия на heroku Это точная проблема, с которой мы столкнулись.

Добавление 12-факторного камня: github.com/heroku/rails_12factor устраняет эту проблему. (Этот гем теперь необходим, если вы используете Rails 4+ на Heroku). Я попытался добавить драгоценный камень rails_12factor в том же репозитории, с которым вы работали, и все ресурсы были загружены нормально.

По сути, этот rails_12factor драгоценный камень представляет собой комбинацию двух драгоценных камней, а именно. rails_serve_static_assets и rails_stdout_logging. Gem rails_serve_static_assets просто устанавливает для этой конфигурации значение true. Обычно это находится в вашем config / environment / production.rb

config.serve_static_assets = true

В общем, если мы разрабатываем Rails4 приложение и развертываем его на наших собственных серверах (скажем, на выделенном сервере, а не на heroku), тогда достаточно установить для этого флага config.serve_static_assets значение true, и нам не нужно добавлять фактор rails_12 или какие-либо другие драгоценные камни. . Вот код rails_serve_static_assets gem, который используется rails_12factor gem.

module RailsServeStaticAssets
  class Railtie < Rails::Railtie
    config.before_initialize do
      if Rails.version >= "4.2.0"
        ::Rails.configuration.serve_static_files = true
      else
        ::Rails.configuration.serve_static_assets = true
      end
      ::Rails.configuration.action_dispatch.x_sendfile_header = nil
    end
  end
end
person Rohan Daxini    schedule 12.05.2015
comment
@Swati, я проверял, как gem rails_12factor решает эту проблему. И после проверки кода и их документации ... все, что он делает, это комбинирует драгоценные камни rails_serve_static_assets и rails_stdout_logging. Gem rails_serve_static_assets позволяет серверу Rails доставлять ресурсы напрямую, вместо того, чтобы возвращать 404. Этот гем достигает такого поведения в приложении, просто устанавливая один параметр конфигурации, config.serve_static_assets = true. Используя гем rails_serve_static_assets, вам не нужно устанавливать эту конфигурацию вручную. :-) - person Rohan Daxini; 13.05.2015
comment
И @Swati, исправление, которое нам нужно, это config.serve_static_assets = true, если мы не хотим использовать все эти драгоценные камни. Эту конфигурацию необходимо было включить из-за изменений Rails4. Gem rails_serve_static_assets включает этот флаг для нас, если мы его используем. В противном случае это просто проблема конфигурации из-за изменений Rails4. - person Rohan Daxini; 13.05.2015

Конвейер ассетов в Rails 4 не компилирует ассеты без дайджеста. По умолчанию компилируются только обработанные ресурсы. Эта опция ничего не делает:

config.assets.digest = false  # Will not compile undigested assets

Вам нужно использовать помощник rails для создания переваренного пути к application.js

<%= stylesheet_link_tag "application" %>

Если это не вариант, вы можете использовать одну из различных стратегий для создания непереваренных ресурсов:

В этом выпуске github проекта sprocket-rails много обсуждений и есть обходные пути.

person Lukas Eklund    schedule 11.05.2015
comment
Спасибо @Lukas Eklund, действительно замечательное обсуждение ссылки, которой вы здесь поделились - ссылка и это привело к пониманию того, почему Rails принял такое решение о хешировании ресурсов. К сожалению, мы попробовали все 4 решения, упомянутые вами выше, и ни одно из них не помогло. Наконец, добавление gem 'rails_12factor' заставило нас работать. Похоже, у нас была другая проблема с ошибкой актива 404. И мы не хотели делать это config.assets.compile =true локально, пока тестировали production режим. - person Rohan Daxini; 12.05.2015

Я думаю, вам нужно включить откат к конвейеру ресурсов в production.rb:

config.assets.compile =true

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

person gouravtiwari21    schedule 11.05.2015

@Swati, сначала очистите конвейер утверждения,

rake asset: clean, а затем запустить

RAILS_ENV = производственные ресурсы граблей: предварительная компиляция

person Chitra    schedule 12.05.2015
comment
Как упомянула Свати выше, очевидно, что она выполняет эти шаги. Не похоже, что проблема связана с прекомпиляцией. - person shinesecret; 12.05.2015
comment
Да, проблема не в precompile, поскольку ресурсы создаются правильно с правильным дайджестом. Таким образом, приведенная выше команда очистки не сильно помогла. Эта проблема больше связана со звездочками и тем, как Rails 4 управляет дайджестом ресурсов во время компиляции. Кстати, у вас есть опечатка в приведенной выше команде, она должна быть rake assets:clean :) - person Rohan Daxini; 12.05.2015