我有几个CSS文件使用url( "../img/my_image.jpg" )
等相对路径来引用图像。
一切都在development
但在production
环境中有效,因为所有CSS文件都打包在一个文件中并且结构丢失,相关路径也会丢失,并且找不到图像。
我有一个资产结构,如下所示:
/app
/assets
/plugins
/my_plugin
/img
my_image.jpg
/css
my_css.css
(/my_plugin
可以是任何插件,其中包含css
,js
和images
个文件组,例如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中有安装和重现问题的说明。
答案 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
环境也能正常工作。