我正在使用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
后,它会预编译所有资产并将它们存储为文件名为application-ca4ad5e0582927b0a78c2b6feef3309b.js
的公共/资产文件夹
在我的本地生产环境中运行应用程序后,它会抛出错误
ActionController::RoutingError (No route matches [GET] "/assets/application.js"):
我尝试更改config.serve_static_assets和其他人的值..但仍面临同样的问题。
预编译文件的名称中使用摘要值保存,例如:application-ca4ad5e0582927b0a78c2b6feef3309b.js
但访问为application.js
,这会导致主要问题。
这里有什么建议吗?感谢..
答案 0 :(得分:4)
请在此处参阅此讨论 - 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
宝石是两颗宝石的组合。 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就足够了,我们不会#39;需要添加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
答案 1 :(得分:3)
Rails 4中的资产管道不会在没有摘要的情况下编译资产。默认是仅编译已消化的资产。此选项不执行任何操作:
config.assets.digest = false # Will not compile undigested assets
您需要使用rails helper来生成application.js
<%= stylesheet_link_tag "application" %>
如果这不是一个选项,您可以使用各种策略之一来生成非消化资产:
This github issue有很多讨论和解决方法。
答案 2 :(得分:1)
我认为你需要在production.rb中启用资产管道回退:
config.assets.compile =true
这意味着您正在进行动态编译(本地供您测试),但在部署到生产时删除此行或将其设置为false。
答案 3 :(得分:0)
@Swati,首先通过 -
清理断言管道rake asset:clean 然后运行
RAILS_ENV =生产佣金资产:预编译