Rails 3.1资产管道在生产中

rpe*_*ayr 6 production ruby-on-rails-3.1 asset-pipeline

我正在使用资产管道(在Rails 3.1.3中)并且正在努力使其在生产中工作.

情况

在我的/app/assets/stylesheets目录中,我有以下文件:

application.css --> this is the default rails one
stylesheet.css --> This is my custom stylesheet
Run Code Online (Sandbox Code Playgroud)

我花了很多时间将我的stylesheet.css包含在/public/assets/生产目录中(通过运行rake assets:precompile),我最终通过在我的application.rb文件中添加以下行来实现:

    config.assets.precompile += ['stylesheet.css']
Run Code Online (Sandbox Code Playgroud)

我知道stylesheet.css在生产中有正确的预编译文件.

我的问题

我遇到的问题是stylesheet_link_tag与我的stylesheet.css文件一起使用时.事实证明:

<%= stylesheet_link_tag "stylesheet" %><link href="/stylesheets/stylesheet.css" media="screen" rel="stylesheet" type="text/css"> 在生产中被解析我希望解决的路径/assets/stylesheet.css 就像在开发中一样.

更令人惊讶的是,application.css即使<%= stylesheet_link_tag "application"%>解决了这个问题,表现也很完美<link href="/stylesheets/stylesheet.css" media="screen" rel="stylesheet" type="text/css">.我不明白的是rails 3.1中不存在public/stylesheets /目录.

任何的想法 ?

rpe*_*ayr 8

理查德·赫尔斯的回答向我指出了正确的方向.发生的事情真的很微妙......

我的问题的答案是Rails 3.1资产在生产中没有指纹.

基本上,我的项目使用mongoid而不是ActiveRecord.根据有关配置的Mongoid 文档,application.rb可以修改该文件,使其不包含以下ActiveRecord内容:

require railties/all
Run Code Online (Sandbox Code Playgroud)

并替换为:

require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "rails/test_unit/railtie"
# require "sprockets/railtie" # Uncomment this line for Rails 3.1+
Run Code Online (Sandbox Code Playgroud)

我习惯于使用rails 3.0.x进行这种操作,我没注意与Rails 3.1相关的注释

我的问题是我不需要链轮!

感谢大家的帮助 !


Ric*_*lse 7

您可以stylesheet.css在开发中访问的原因是Sprockets的工作原理.

在开发模式下,对/ assets下的任何内容的所有请求都将发送到Sprockets进行处理.链接将直接将请求映射到路径,一对一,因此您可以访问存储在其中的任何资产app/assets/etc.

所有请求都通过 Sprockets; 它将文件提供给您的浏览器.

在生产中,事情是不同的.指纹被添加到文件名中,期望您将资产预编译为静态文件.这是出于性能原因 - Sprockets不够快,无法满足大量请求.

只有默认清单引用的CSS和JS文件才会被编译到application.css和application.js中.您引用的其他文件不会预编译,除非它们已添加到config.assets.precompile配置文件中的数组中.

你说文件解析为/stylesheets/stylesheet.css.管道应该在开发中生成这样的路径:/assets/applicaton.css.在生产中,文件名中应该有指纹.您发布的内容表明管道未启用(这些是旧的,3.1之前的文件位置).

如果这是一个升级的应用程序,很可能你错过了一些关键的配置选项.这是开发生产问题的主要原因.检查管道选项的设置是否与管道指南的最后一部分完全相同.(我的猜测是你在application.rb 中缺少)config.assets.enabled = true

为清楚起见,我建议更改stylesheet.cssto 的名称admin.css,同时将其包含在预编译数组中(正如您已经完成的那样).

如果配置选项设置正确,并且管理清单包含在预编译中,则应该为前端提供application.css,为后端提供admin.css,这两种方式都可以通过帮助方法进行链接.