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/****.jspath) ,这是非常令人困惑的。

在导轨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. 预编译资产。
  2. 将服务器上的资源提供给浏览器。

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.04ruby2.2.1Rails的4.2.4我已经跟随从DigitalOcean部署Turorial一切顺利,但是当我去浏览器并input我的VPS的IP地址我的应用程序被加载,但没有样式和JavaScript。

该应用程序正在与UnicornNginx运行。 要解决这个问题,我用我的用户“部署者”使用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兽移到美洲狮。