Rails 3.1资产管道在生产中

问题描述 投票:6回答:4

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

情况

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

application.css --> this is the default rails one
stylesheet.css --> This is my custom stylesheet

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

    config.assets.precompile += ['stylesheet.css']

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

我的问题

我遇到的问题是使用stylesheet_link_tagstylesheet.css文件。 事实证明:

<%= stylesheet_link_tag "stylesheet" %>被解析为<link href="/stylesheets/stylesheet.css" media="screen" rel="stylesheet" type="text/css"> 在制作中我希望路径到像在开发中一样解析成/assets/stylesheet.css

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

任何想法 ?

ruby-on-rails-3.1 asset-pipeline production
4个回答
8
投票

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

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

基本上,我的项目使用mongoid而不是ActiveRecord。 根据有关配置的Mongoid 文档 ,可以修改application.rb文件,使其不包含ActiveRecord ,这意味着删除:

require railties/all

并替换为:

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+

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

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

谢谢大家的帮助 !


7
投票

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

在开发模式下,对/ assets下的任何内容的所有请求都将发送到Sprockets进行处理。 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.css的名称更改为admin.css ,同时将其包含在预编译数组中(如您所做)。

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


1
投票

application.css应该是一个清单文件,这意味着当您运行程序时,它应该自动包含stylesheet.css

确保它有这两行。

application.css:

/*
 *= require_self
 *= require_tree . 
*/

如果它确实那么其他东西不能正常工作,你不应该需要这条线:

config.assets.precompile += ['stylesheet.css']

如果这不起作用,请确保您已从此资产管道指南中启用了所有设置。


0
投票

当我环顾actionpack以查看可能导致此问题的原因时,我在3.1.1日志中找到了这个小宝石:

javascript_path and stylesheet_path now refer to /assets if asset pipelining is on.

Soooo,如果您正在使用3.1.0升级到3.1.1并查看它是否修复了它。 如果你已经升级了,那就回到原点了。 但它确实描述了您的问题,因为stylesheet_link_tag使用stylesheet_path

© www.soinside.com 2019 - 2024. All rights reserved.