Rails 4:资产没有在生产中加载
我试图把我的应用程序投入生产和图像和CSS资产path不起作用。
这是我目前正在做的事情:
- 图片资产位于/app/assetshttp://img.dovov.comimage.jpg
- 样式表位于/app/assets/stylesheets/style.css
- 在我的布局中,我参考了这样的CSS文件:
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
- 在重新启动独angular兽之前,我运行
RAILS_ENV=production bundle exec rake assets:precompile
并成功,我在public/assets
目录中看到指纹文件。
当我浏览到我的网站,我得到一个404 mysite.com/stylesheets/styles.css
找不到错误。
我究竟做错了什么?
更新:在我的布局,它看起来像这样:
<%= stylesheet_link_tag "bootstrap.min", media: "all", "data-turbolinks-track" => true %> <%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %> <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
生成源是这样的:
<link data-turbolinks-track="true" href="/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" /> <link data-turbolinks-track="true" href="/stylesheets/styles.css" media="all" rel="stylesheet" /> <script data-turbolinks-track="true" src="/assets/application-0c647c942c6eff10ad92f1f2b0c64efe.js"></script>
看起来像Rails不正确寻找编译的CSS文件。 但是为什么它对javascripts正常工作呢(注意/assets/****.js
path) 呢 ,这是非常令人困惑的。
在导轨4中,您需要进行以下更改:
config.assets.compile = true config.assets.precompile = ['*.js', '*.css', '*.css.erb']
这与我工作。 使用以下命令预先编译资产
RAILS_ENV=production bundle exec rake assets:precompile
祝你好运!
我刚刚遇到同样的问题,在config / environments / production.rb中find了这个设置:
# Rails 4: config.serve_static_assets = false # Or for Rails 5: config.public_file_server.enabled = false
改变它true
工作。 默认情况下,Rails希望你已经configuration好你的前端web服务器来处理公用文件夹外的文件请求,而不是代理他们到Rails应用程序。 也许你已经为你的JavaScript文件做了这个,但不是你的CSS样式表?
( 请参阅Rails 5文档 )。 正如在注释中指出的那样,在Rais 5中,您可以只设置RAILS_SERVE_STATIC_FILES
环境variables,因为缺省设置是config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
。
在/config/environments/production.rb
我不得不添加这个:
Rails.application.config.assets.precompile += %w( *.js ^[^_]*.css *.css.erb )
.js已经被预编译了,但我仍然添加了它。 .css和.css.erb显然不会自动发生。 ^[^_]
排除部分被编译 – 这是一个正则expression式。
有点令人沮丧的是,文档清楚地表明,资产pipe道默认启用,但没有阐明只适用于javascripts的事实。
我能够通过改变: config.assets.compile = false
来解决这个问题
config.assets.compile = true
在/config/environments/production.rb
有两件事情你必须完成服务生产资产:
- 预编译资产。
- 将服务器上的资源提供给浏览器。
1)为了预编译资产,你有几个select。
-
您可以运行
rake assets:precompile
在本地机器上进行rake assets:precompile
,将其提交给源代码控制(git),然后运行部署程序,例如capistrano。 这不是将预编译资产提交给SCM的好方法。 -
您可以编写运行
RAILS_ENV=production rake assets:precompile
的rake任务RAILS_ENV=production rake assets:precompile
在每次将Rails应用程序部署到生产环境时,在目标服务器上进行RAILS_ENV=production rake assets:precompile
,然后重新启动服务器。
在capistrano的任务代码将看起来类似于这样的:
on roles(:app) do if DEPLOY_ENV == 'production' execute("cd #{DEPLOY_TO_DIR}/current && RAILS_ENV=production rvm #{ruby_string} do rake assets:precompile") end end
2)现在,您拥有生产服务器上的资产,您需要将它们提供给浏览器。
再次,你有几个select。
-
打开config / environments / production.rb中的 Rails静态文件服务
config.serve_static_assets = true # old or config.serve_static_files = true # new
使用Rails提供静态文件会导致你的Rails应用程序性能下降。
-
configurationnginx(或Apache)来提供静态文件。
例如,configuration为与Puma一起工作的我的nginx如下所示:
location ~ ^/(assets|images|fonts)/(.*)$ { alias /var/www/foster_care/current/public/$1/$2; gzip on; expires max; add_header Cache-Control public; }
对于rails 5,你应该启用下面的configuration代码:
config.public_file_server.enabled = true
默认情况下,rails 5附带这行configuration:
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
因此,您将需要将环境variablesRAILS_SERVE_STATIC_FILES
设置为true。
Rails 4不再生成非指纹版本的资源:stylesheets / style.css将不会为您生成。
如果你使用stylesheet_link_tag
那么你的stylesheet_link_tag
的正确链接将被生成
另外styles.css
应该在config.assets.precompile
,它是预编译的东西的列表
我正在运行的Ubuntu服务器14.04 , ruby2.2.1和Rails的4.2.4我已经跟随从DigitalOcean部署Turorial一切顺利,但是当我去浏览器并input我的VPS的IP地址我的应用程序被加载,但没有样式和JavaScript。
该应用程序正在与Unicorn和Nginx运行。 要解决这个问题,我用我的用户“部署者”使用SSH进入我的服务器,然后转到我的应用程序path“/ home / deployer / apps / blog”,然后运行以下命令:
RAILS_ENV=production bin/rake assets:precompile
然后我只是重新启动VPS,就是这样! 这个对我有用!
希望对别人有用!
更改您的Production.rb文件行
config.assets.compile = false
成
config.assets.compile = true
并添加
config.assets.precompile = ['*.js', '*.css', '*.css.erb']
如果预编译被设置,你不需要
config.assets.compile = true
因为这是为现场服务的资产。
我们的问题是我们只有在config/secrets.yml
设置了开发密钥库
development: secret_key_base: '83d141eeb181032f4070ae7b1b27d9ff'
需要input生产环境
用于编译文件的默认匹配器包括应用程序/资产文件夹(包括您的gem)中的application.js,application.css和所有非JS / CSS文件(这将自动包括所有图像资源):
如果您还有其他清单或单独的样式表和JavaScript文件,您可以将它们添加到config / initializers / assets.rb中的预编译数组中:
Rails.application.config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js']
http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets
find这个:
configuration选项config.serve_static_assets
已被重命名为config.serve_static_files
以阐明其作用。
在config/environments/production.rb
:
# Disable serving static files from the `/public` folder by default since # Apache or NGINX already handles this. config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
所以设置env RAILS_SERVE_STATIC_FILES
或使用Nginx
来提供静态文件。 添加config.serve_static_assets = true
将仍然有效,但将来会被删除。
首先检查你的资产,这可能是预先编译资产时出现的一些错误。
要在生产ENV中预编译资产,请运行以下命令:
RAILS_ENV=production rake assets:precompile
如果显示错误,请先删除,
在“未定义的variables”错误的情况下,加载该variables文件,然后在另一个文件中使用它。
例:
@import "variables"; @import "style";
在application.rb文件中设置预先编译资产的顺序
例:
config.assets.precompile += [ 'application.js', 'admin.js', 'admin/events.js', 'admin/gallery.js', 'frontendgallery.js'] config.assets.precompile += [ 'application.css', 'admin.css','admin/events.css', 'admin/gallery.css', 'frontendgallery.css']
我可能是错的,但build议改变的人
config.assets.compile = true
该行的注释如下:#如果预编译的资源丢失,则不要回退到资产pipe道。
这表明,通过设置为true,您不是在解决问题,而是绕过它并每次运行pipe道。 这肯定会杀死你的performance,并打败pipe道的目的?
我有这个相同的错误,这是由于应用程序运行在一个子文件夹,铁轨不知道。
所以我的CSS文件在家里/子文件夹/应用程序/公共/ ….但轨道正在寻找在家里/应用程序/公共/ …
请尝试将您的应用程序移出子文件夹,或告诉导航栏位于子文件夹中。
不build议让capistrano做预先编译的资源,因为它可能需要很长时间,并经常超时。 尝试执行本地资源预编译。
1,在config / application.rb中设置config.assets.initialize_on_precompile = false
然后执行本地RAILS_ENV=production bin/rake assets:precompile
并将这些公共/资产添加到git。
和config / environments / development.rb,更改资产path以避免使用预编译的资产:
config.assets.prefix = '/dev-assets'
如果你有数据库连接问题,意味着你有使用数据库的初始值设定项。 一个方法是通过复制production.rb(也许是production2 .rb)和database.yml来设置一个新环境,然后在开发数据库设置中添加production2环境。 然后做
RAILS_ENV=production2 bin/rake assets:precompile
如果你仍然面临一些资产问题,例如ckeditor,那么把js文件添加到config / initializers / assets.rb
Rails.application.config.assets.precompile += %w( ckeditor.js )
location ~ ^/assets/ { expires 1y; add_header Cache-Control public; add_header ETag ""; }
这解决了我在生产中的问题。 把它放入nginxconfiguration。
即使我们面对同样的问题RAILS_ENV=production bundle exec rake assets:precompile
成功,但事情没有按预期工作。
我们发现独angular兽是这里的主要罪魁祸首。
和你的情况一样,甚至我们在编译资产之后也重新启动了独angular兽。 有人注意到,当独angular兽重新启动时,只有其工作进程重新启动,而不是主进程。
这是没有正确资产的主要原因。
之后,在编译资产之后,我们停止并开始了独angular兽,这样独angular兽主进程也重新启动,正确的资产得到了服务。
与重新启动独angular兽相比,停止和启动独angular兽会导致10秒的停机时间。 这是可以使用的解决方法,因为长期解决scheme是从独angular兽移到美洲狮。