Rails 3资产& CSS相对URLS

时间:2012-09-02 12:13:15

标签: ruby-on-rails ruby-on-rails-3.2 asset-pipeline

我有几个CSS文件使用url( "../img/my_image.jpg" )等相对路径来引用图像。

一切都在development但在production环境中有效,因为所有CSS文件都打包在一个文件中并且结构丢失,相关路径也会丢失,并且找不到图像。

我的结构细节

我有一个资产结构,如下所示:

/app
  /assets
    /plugins
      /my_plugin
        /img
          my_image.jpg
        /css
          my_css.css

/my_plugin可以是任何插件,其中包含cssjsimages个文件组,例如Twitter Bootstrap任何其他文件

进入/app/assets/plugins/my_plugin/my_css.css我有类似的东西:

background-image: url("../img/my_image.jpg");

/app/assets/stylesheets/application.css

*= require css/my_css.css

最后在head文件的html中:

<%= stylesheet_link_tag "application" %>

我该怎么做才能解决这个问题?

更新

Mini application to reproduce the issue,在README中有安装和重现问题的说明。

2 个答案:

答案 0 :(得分:7)

我没有看到连接CSS文件的问题。而且您不必手动包含深层嵌套的CSS文件:默认情况下,application.css已在行*= require_tree .中执行此操作

图像将重复您的app/assets/images结构。要在开发和生产环境中正确处理它们,您需要the respective Guide。查看 2.2 Coding Links to Assets 部分。有关编码图像文件路径的说明:

CSS通过ERb:

 url(<%= asset_path 'image.png' %>)

CSS通过Sass:

 image-url("rails.png")

预编译图像末尾的所有这些奇怪的十六进制字符都将自动受到尊重。

<强> UPD

我发现根本不需要插件的资产管道功能。您的样式/脚本已经缩小。您可以将plugins文件夹移到public文件夹中(成为<APP_ROOT>/public/plugins/)。

然后删除 application.css

中的以下行
*= require bootstrap/css/bootstrap

而是将以下行添加到您的模板application.html.erb

  <%= stylesheet_link_tag    "/plugins/bootstrap/css/bootstrap.min.css", :media => "all" %>
  <%= javascript_include_tag "/plugins/bootstrap/js/bootstrap.min.js" %>

现在,您必须能够通过替换public/plugins/bootstrap的内容轻松切换主题。

UPD 2

可能您必须明确告诉 Rails {em}插件资产 :

precompile

答案 1 :(得分:2)

我已经能够解决将插件资源移动到/app/vendor/assets/plugins的问题,我认为这是更好的地方,因为它们不是与我的应用程序直接相关的资产,而是实际供应商资产。

然后我们有:

/app
  /vendor
    /assets
      /plugins
        /my_plugin
          /img
            my_image.jpg
          /css
            my_css.css

我们在另一个css调用中加载主stylesheet_link_tag,如下所示:

<%= stylesheet_link_tag "my_plugin/css/my_css", :media => "all" %>

此时一切看起来都正确,但即使我们运行my_css.css Rails 也不会编译抱怨rake assets:precompile

解决方案是明确告诉 Rails 编译此文件:

# /config/environments/production.rb
config.assets.precompile += %w( my_plugin/css/my_css.css )

现在rake assets:precompile将编译我们的插件css,即使使用 relative urls production环境也能正常工作。

检查diff changes those have resolved the issue