Rails 4:运行 资产预编译后在生产模式下的应用程序出现资产未找到问题
Rails 4: run application in production mode after assets precompile gives assets not found issue
我正在使用 rails 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
访问,这是导致主要问题的原因。
这里有什么建议吗??谢谢..
我认为您需要在 production.rb:
中启用回退到资产管道
config.assets.compile =true
这意味着您正在动态编译(本地供您测试),但是当您部署到生产环境时,请删除此行或将其设置为 false。
Rails4 中的资产管道不会在没有摘要的情况下编译资产。默认是只编译消化的资产。此选项不执行任何操作:
config.assets.digest = false # Will not compile undigested assets
您需要使用 rails 帮助程序来生成 application.js
的摘要路径
<%= stylesheet_link_tag "application" %>
如果这不是一个选项,您可以使用多种策略之一来生成未消化的资产:
- non stupid digest assets gem
- custom rake task
- rack middleware to serve non-digested assets
- sprockets redirects
This github issue 在 sprocket-rails 项目上有很多讨论和解决方法。
@Swati,首先通过-
清理断言管道
耙 asset:clean 然后 运行
RAILS_ENV=生产耙assets:precompile
在此处引用此讨论 - Most of my assets suddenly return 404 after a push to heroku
这正是我们面临的问题。
添加 12 个因子 gem:github.com/heroku/rails_12factor 修复了这个问题。 (如果您在 Heroku 上 运行 Rails 4+,则现在需要此 gem)。
我尝试在您正在工作的同一个回购中添加 gem 'rails_12factor' ,这会很好地加载所有资产。
基本上这个 rails_12factor
gem 是 2 gem 的组合,即。 rails_serve_static_assets
和 rails_stdout_logging
。 Gem rails_serve_static_assets
只是将此配置设置为 true。这通常在您的 config/environments/production.rb
config.serve_static_assets = true
所以一般来说,如果我们正在开发一个 Rails4
应用程序并且我们部署在我们自己的服务器上(比如专用服务器而不是 heroku),那么将这个标志 config.serve_static_assets
设置为 true 就足够了并且我们不需要添加 rails_12 因素或任何其他 gem。这是 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
我正在使用 rails 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
访问,这是导致主要问题的原因。
这里有什么建议吗??谢谢..
我认为您需要在 production.rb:
中启用回退到资产管道config.assets.compile =true
这意味着您正在动态编译(本地供您测试),但是当您部署到生产环境时,请删除此行或将其设置为 false。
Rails4 中的资产管道不会在没有摘要的情况下编译资产。默认是只编译消化的资产。此选项不执行任何操作:
config.assets.digest = false # Will not compile undigested assets
您需要使用 rails 帮助程序来生成 application.js
<%= stylesheet_link_tag "application" %>
如果这不是一个选项,您可以使用多种策略之一来生成未消化的资产:
- non stupid digest assets gem
- custom rake task
- rack middleware to serve non-digested assets
- sprockets redirects
This github issue 在 sprocket-rails 项目上有很多讨论和解决方法。
@Swati,首先通过-
清理断言管道耙 asset:clean 然后 运行
RAILS_ENV=生产耙assets:precompile
在此处引用此讨论 - Most of my assets suddenly return 404 after a push to heroku 这正是我们面临的问题。
添加 12 个因子 gem:github.com/heroku/rails_12factor 修复了这个问题。 (如果您在 Heroku 上 运行 Rails 4+,则现在需要此 gem)。 我尝试在您正在工作的同一个回购中添加 gem 'rails_12factor' ,这会很好地加载所有资产。
基本上这个 rails_12factor
gem 是 2 gem 的组合,即。 rails_serve_static_assets
和 rails_stdout_logging
。 Gem rails_serve_static_assets
只是将此配置设置为 true。这通常在您的 config/environments/production.rb
config.serve_static_assets = true
所以一般来说,如果我们正在开发一个 Rails4
应用程序并且我们部署在我们自己的服务器上(比如专用服务器而不是 heroku),那么将这个标志 config.serve_static_assets
设置为 true 就足够了并且我们不需要添加 rails_12 因素或任何其他 gem。这是 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