Rails资产未生成正确的URL用于预编译资产

3
我正在使用Ruby on Rails 4开发一个网站,一些CSS文件的路径出现了问题。
以下这些资源没有被包含在我的application.sass文件中:
- mobile.scss - mozilla.scss - msie.scss - opera.scss - webkit.scss
我已经在我的application.rb文件中引入了它们,以便使用以下内容进行预编译:
config.assets.precompile += [
  'mobile.css',
  'mozilla.css',
  'msie.css',
  'opera.css',
  'webkit.css'
]

在我的生产服务器上,我运行了以下命令(注意:使用touch命令是为了确保应用程序重新启动并清除缓存,因为我正在使用Phusion Passenger和Nginx作为服务器):

rake assets:precompile RAILS_ENV=production
touch tmp/restart.txt

在运行上述命令后,我注意到资产已经预编译并存储在我的public/assets/目录中。它们也正确地列在public/assets/目录下的manifest.json文件中。
当我在浏览器中加载站点并查看源代码时,我注意到特定于浏览器的CSS文件没有使用正确的资产路径。它显示为:
<link href="/assets/application-ec1031f251a585c79d4404ef2899f6d1.css" media="screen" rel="stylesheet" />
<link href="/stylesheets/webkit.css" media="screen" rel="stylesheet" />

我希望看到的是:

<link href="/assets/application-ec1031f251a585c79d4404ef2899f6d1.css" media="screen" rel="stylesheet" />
<link href="/assets/webkit-70899fec75bb8eae24edae491a94f73a.css" media="screen" rel="stylesheet" />

我的视图使用以下代码:

<% if @mobile %>
  <%= stylesheet_link_tag :mobile %>
<% else %>
  <%= stylesheet_link_tag :application %>
  <%= stylesheet_link_tag :msie if @browser == 'Internet Explorer' %>
  <%= stylesheet_link_tag :opera if @browser == 'Opera' %>
  <%= stylesheet_link_tag :mozilla if @browser == 'Mozilla' %>
  <%= stylesheet_link_tag :webkit if @browser == 'Webkit' %>
<% end %>

我的问题是,webkit.css 路径不应该输出正确吗?还是我漏了什么?非常感谢您的帮助。

当Rails打印像/stylesheets/webkit.css这样的路径时,意味着它无法找到该资产的预编译版本。 - Ross Allen
1
为什么成功创建并位于“public/assets/”文件夹中,但无法找到它的原因是什么? - user1331999
你找到解决方案了吗? - Micka
很遗憾,我还没有时间深入研究。 - user1331999
我曾经遇到过同样的问题,但是根据Rails指南中的规定,您需要在预编译数组中包含任何其他清单文件。config.assets.precompile += ['admin.js','admin.css','swfObject.js'] - pixeltom
2个回答

1
当你在生产模式下预编译资产(假设你遵循了Rails资产管道指南),你所有位于app/assets下的资产将被编译成application.css。因此,这里列出的所有文件已经包含在application.css中:
config.assets.precompile += [
  'mobile.css',
  'mozilla.css',
  'msie.css',
  'opera.css',
  'webkit.css'
]

这是推荐的方法,因为一个较大的文件比几个较小的文件加载更快,因为HTTP请求和响应通常是应用程序过程中最慢的部分。
如果您绝对需要根据浏览器类型有条件地包含样式表,则可以选择以下操作之一:
1. 从asset pipeline清单中删除它们,在application.css中保留CSS文件,并像上面那样包含它们。 2. 将CSS文件移出asset pipeline目录,然后像上面在视图代码中一样包含它们。这样,它们就不会被编译到application.css文件中,可以单独加载。
请记住,这两种选项都会破坏asset pipeline的主要意图之一。

0

抱歉如果我说得太明显了,但是你在你的production.rb文件中有没有声明:

config.serve_static_assets = true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接