ruby-on-rails - view教程 - 创建rails项目




Rails 4:资产没有在生产中加载 (12)

用于编译文件的默认匹配器包括应用程序/资产文件夹(包括您的宝石)中的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

我正在尝试将我的应用投入生产,并且图像和CSS资产路径不起作用。

以下是我目前正在做的事情:

  • 图片资产位于/app/assets/images/image.jpg中
  • 样式表位于/app/assets/stylesheets/style.css中
  • 在我的布局中,我参考了这样的CSS文件: <%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
  • 在重新启动独角兽之前,我运行RAILS_ENV=production bundle exec rake assets:precompile并成功,我在public/assets目录中看到指纹文件。

当我浏览我的网站时, mysite.com/stylesheets/styles.css出现404未找到的错误。

我究竟做错了什么?

更新:在我的布局中,它看起来像这样:

<%= 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路径)非常混乱。


你不应该做什么:

上面的一些同事建议你这样做:

config.serve_static_assets = true  ## DON”T DO THIS!! 
config.public_file_server.enabled = true ## DON”T DO THIS!!

铁轨资产管道说到上述方法:

此模式使用更多内存,性能比默认值差,因此不推荐使用。 请参阅:( http://edgeguides.rubyonrails.org/asset_pipeline.html#live-compilation

你应该做什么:

1.预编译您的资产。

RAILS_ENV=production rake assets:precompile

2.将这些文件添加到git。

git add –all

3.推向heroku。

git push origin master


即使我们遇到了同样的问题: RAILS_ENV=production bundle exec rake assets:precompile成功,但事情没有按预期工作。
我们发现独角兽是这里的主要罪魁祸首。

和你的情况一样,即使我们在编译资产之后也重新启动了独角兽。 有人注意到,当独角兽重新启动时,只有其工作进程重新启动,而不是主进程。
这是无法提供正确资产的主要原因。

之后,在编译资产之后,我们停止并启动独角兽,以便独角兽主进程也重新启动并获得正确的资产。
与重新启动独角兽相比,停止和启动独角兽会导致停机时间大约为10秒。 这是可以在长期解决方案从独角兽转移到美洲狮时使用的解决方法。


/config/environments/production.rb我不得不添加这个:

Rails.application.config.assets.precompile += %w( *.js ^[^_]*.css *.css.erb )

.js已经进行了预编译,但我仍然添加了它。 .css和.css.erb显然不会自动发生。 ^[^_]排除部分被编译 - 这是一个正则表达式。

有点令人沮丧的是,文档明确指出资产管道是默认启用的,但没有阐明仅适用于JavaScript的事实。


如果预编译已设置,则不需要

config.assets.compile = true

因为这是为现场服务的资产。

我们的问题是我们只有在config/secrets.yml设置了开发密钥库

development:
    secret_key_base: '83d141eeb181032f4070ae7b1b27d9ff'

需要输入生产环境


对于Rails 5,您应该启用以下配置代码:

config.public_file_server.enabled = true

默认情况下,Rails 5附带这行配置:

config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

因此,您需要将环境变量RAILS_SERVE_STATIC_FILES设置为true。


您必须完成两件事才能为生产中的资产提供服务:

  1. 预编译资产。
  2. 将服务器上的资产提供给浏览器。

1)为了预编译资产,你有几个选择。

  • 您可以运行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)现在,您拥有生产服务器上的资产,您需要将它们提供给浏览器。

再次,你有几个选择。

  • 打开config / environments / production.rb中的 Rails静态文件服务

    config.serve_static_assets = true # old
    
    or
    
    config.serve_static_files = true # new
    

    使用Rails提供静态文件会导致你的Rails应用程序性能下降。

  • 配置nginx(或Apache)以提供静态文件。

    例如,我配置为与Puma一起工作的nginx看起来像这样:

    location ~ ^/(assets|images|fonts)/(.*)$ {
        alias /var/www/foster_care/current/public/$1/$2;
        gzip on;
        expires max;
        add_header Cache-Control public;
    }
    

我只是遇到了同样的问题,并在config / environments / production.rb中找到了这个设置:

# Rails 4:
config.serve_static_assets = false

# Or for Rails 5:
config.public_file_server.enabled = false

改变它为true工作。 默认情况下,Rails希望你已经配置了你的前端web服务器来处理公用文件夹中的文件请求,而不是将它们代理到Rails应用程序。 也许你已经完成了你的JavaScript文件,但不是你的CSS样式表?

请参阅Rails 5文档 )。 正如评论中指出的那样,在Rails 5中,您可以设置RAILS_SERVE_STATIC_FILES环境变量,因为默认设置是config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?


我正在运行Ubuntu Server 14.04Ruby 2.2.1Rails 4.2.4我已经遵循DigitalOcean的部署并且一切顺利,但是当我进入浏览器并输入我的VPS的IP地址时,我的应用程序已加载,但没有样式和JavaScript。

该应用程序正在与UnicornNginx一起运行。 为了解决这个问题,我用我的用户'deployer'使用SSH进入了我的服务器,并进入我的应用程序路径,即'/ home / deployer / apps / blog'并运行以下命令:

RAILS_ENV=production bin/rake assets:precompile

然后我重新启动VPS,就是这样! 这个对我有用!

希望它对其他人有用!


我能够通过改变: config.assets.compile = false来解决这个问题
config.assets.compile = true/config/environments/production.rb


更改您的Production.rb文件行

config.assets.compile = false

config.assets.compile = true

并添加

config.assets.precompile =  ['*.js', '*.css', '*.css.erb']

首先检查你的资产,这可能会在资产预编译时出现一些错误。

要在生产ENV中预编译资产,请运行以下命令:

RAILS_ENV=production rake assets:precompile

如果显示错误,请先删除,

如果出现“未定义的变量”错误,请在将该变量文件用于其他文件之前加载该变量文件。

例:

@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']




ruby-on-rails-4