【问题标题】:Rails Asset Not Generating Correct URL for Precompiled AssetRails 资产未为预编译资产生成正确的 URL
【发布时间】:2013-11-05 15:02:43
【问题描述】:

我正在使用 Ruby on Rails 4 开发一个网站,但遇到一些 CSS 文件的路径问题。

我的applicaiton.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 这样的路径时,这意味着它无法找到该资产的预编译版本。
  • 知道为什么在成功创建它并且它位于public/assets/ 文件夹中时找不到它吗?
  • 你找到解决办法了吗?
  • 很遗憾,我没有时间做太多的挖掘工作。
  • 我遇到了同样的问题,但正如 Rails 指南中所指定的,您需要在预编译数组中包含任何其他清单文件。 config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js']

标签: css ruby-on-rails ruby-on-rails-4 asset-pipeline


【解决方案1】:

当您在生产模式下预编译资产时(假设您关注the Rails asset pipeline guide,那么您在app/assets 下的所有资产都将编译为application.css。因此,此处列出的所有文件都已在application.css 中:

config.assets.precompile += [
  'mobile.css',
  'mozilla.css',
  'msie.css',
  'opera.css',
  'webkit.css'
]

这是推荐的方法,因为一个较大的文件比几个较小的文件加载速度更快,因为 HTTP 请求和响应通常是应用程序过程中最慢的部分。

如果您绝对需要根据代码中的浏览器类型有条件地包含样式表,您可以:

  1. 从 application.css 的资产管道清单中删除它们,并将 CSS 文件保留在 app/assets/stylesheets 目录中,然后像上面那样包含它们。
  2. 将 CSS 文件移到资产管道目录之外,然后像在上面的视图代码中一样包含它们。这样就不会被编译成application.css文件,可以单独加载

请记住,这些选项中的任何一个都违背了资产管道的主要意图之一。

【讨论】:

    【解决方案2】:

    对不起,如果我有点太明显了,但你有没有在你的 production.rb 中说明:

    config.serve_static_assets = true
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多