Ruby on rails 4 Rails 4:在资产预编译导致资产未找到问题后,以生产模式运行应用程序
我使用的是rails 4.1.8 在production.rb文件中,我有以下内容:Ruby on rails 4 Rails 4:在资产预编译导致资产未找到问题后,以生产模式运行应用程序,ruby-on-rails-4,asset-pipeline,production-environment,ruby-on-rails-4.1,Ruby On Rails 4,Asset Pipeline,Production Environment,Ruby On Rails 4.1,我使用的是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.ass
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\u ENV=production rake assets:precompile
之后,它将预编译所有资产,并将它们存储在文件名为application-ca4ad5e05e0582927b0a78c2b6feef3309b.js的公共/资产文件夹中
在本地的生产环境中运行应用程序后,它抛出错误
ActionController::RoutingError (No route matches [GET] "/assets/application.js"):
我尝试更改config.service\u static\u资产和其他资产的值。。但仍然面临同样的问题
预编译文件以其名称中的摘要值保存,例如:application-ca4ad5e0582927b0a78c2b6feef3309b.js
,但作为application.js
访问,这是主要问题的根源
这里有什么建议吗??谢谢..我认为您需要在production.rb中启用资产管道回退:
config.assets.compile =true
这意味着您正在进行动态编译(本地供您测试),但当您部署到生产环境时,请删除此行或将其设置为false。Rails 4中的资产管道在编译资产时不会没有摘要。默认情况下,只编译摘要资产。此选项不起任何作用:
config.assets.digest = false # Will not compile undigested assets
您需要使用rails助手生成application.js的摘要路径
<%= stylesheet_link_tag "application" %>
如果这不是一种选择,您可以使用多种策略中的一种来生成非消化资产:
关于sprocket rails项目,有很多讨论和解决方法。@Swati,首先通过-
耙资源:清理然后运行
RAILS\u ENV=生产rake资产:预编译
这正是我们面临的问题
添加12因子gem:修复了这个问题。(如果您在Heroku上运行Rails 4+,则现在需要此gem)。
我试着在你工作的同一份回购协议中添加gem'railsu factor',这会很好地加载所有资产
基本上,这个rails_12factor
gem是两个gem的组合,即rails\u服务于静态资产
和rails\u标准资产
。Gemrails\u service\u static\u assets
只是将此配置设置为true。这通常在config/environments/production.rb中
config.serve_static_assets = true
因此,一般来说,如果我们正在开发一个Rails4
应用程序,并且我们部署在自己的服务器上(比如说一个专用服务器而不是heroku),那么将这个标志config.service\u static\u assets
设置为true就足够了,我们不需要添加rails\u 12 factor或任何其他gems。以下是rails\u service\u static\u assets
gem的代码,由rails\u 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
模块RailserveStaticAssets
类Railtie=“4.2.0”
::Rails.configuration.service\u static\u files=true
其他的
::Rails.configuration.service\u static\u assets=true
结束
::Rails.configuration.action\u dispatch.x\u sendfile\u header=nil
结束
结束
结束
如上所述,Swati显然正在执行这些步骤。看起来问题不在于预编译。是的,问题不在于precompile
,因为资产是用正确的摘要正确生成的。因此,上面的clean命令没有多大帮助。这个问题与链轮以及Rails 4在编译时如何管理资产摘要有更多的关系。顺便说一句,您在上面的命令中有一个输入错误,应该是rake assets:clean
:)谢谢@Lukas Eklund,关于您在这里共享的链接的讨论真是太棒了,这让我们了解了Rails为什么会在资产哈希上做出这样的决定。不幸的是,我们尝试了您上面提到的所有4种解决方案,但均无效。最后,添加gem'rails\u 12factor'
使它适合我们。似乎我们对资产404错误有不同的问题。当我们测试生产模式时,我们不想在本地执行这个config.assets.compile=true
。@Swati,我正在检查gemrails\u 12factor
是如何解决这个问题的。在检查代码和文档之后。。。它所做的只是将gemsrails\u service\u static\u资产
和rails\u stdout\u日志记录
结合起来。Gemrails\u service\u static\u资产
允许rails服务器直接交付资产,而不是返回404。此gem通过简单地设置单个配置选项config.service\u static\u assets=true,在应用程序中实现此行为。通过使用rails\u serve\u static\u assets gem,您无需手动设置此配置。:-)而@Swati,如果我们不想使用所有这些gem,我们需要的修复就是这个config.service\u static\u assets=true
。由于Rails4的更改,需要启用此配置。Gemrails\u service\u static\u assets
为我们启用该标志(如果我们使用它)。否则,由于Rails4的更改,这只是一个配置问题。