Ruby on rails Rails资产管道-如何包含不在资产路径中的资产?

Ruby on rails Rails资产管道-如何包含不在资产路径中的资产?,ruby-on-rails,asset-pipeline,erb,Ruby On Rails,Asset Pipeline,Erb,我已经将我的这个多皮肤应用程序转换为使用Rails 3.1中引入的资产管道。在大多数情况下,它非常简单,我喜欢预处理功能,它允许您在CSS/JS文件中使用内嵌Ruby 不过,我遇到了一个大问题,尽管链轮很强大,但似乎很难解决。我的应用程序可以使用运行时选择的任意数量的皮肤(或者“身份”)运行。这个“identity”参数设置缓存目录、数据库连接、视图路径,甚至资产路径。虽然所有的“标识”都可以有自己的样式表,但也有一个共享的样式表,可以在所有实例中使用。因此,资产文件夹结构如下所示: 在/app

我已经将我的这个多皮肤应用程序转换为使用Rails 3.1中引入的资产管道。在大多数情况下,它非常简单,我喜欢预处理功能,它允许您在CSS/JS文件中使用内嵌Ruby

不过,我遇到了一个大问题,尽管链轮很强大,但似乎很难解决。我的应用程序可以使用运行时选择的任意数量的皮肤(或者“身份”)运行。这个“identity”参数设置缓存目录、数据库连接、视图路径,甚至资产路径。虽然所有的“标识”都可以有自己的样式表,但也有一个共享的样式表,可以在所有实例中使用。因此,资产文件夹结构如下所示:

在/app/assets/stylesheets/aplication.css.erb中:

<% require_asset("shared.css") %>
<% require_asset("overrides.css") %>
<% require_asset("shared.css") %>
<% require_asset("overrides.css") %>
可以通过将同名文件放在“实例资源”文件夹中来覆盖

/app/assets/[identity]/stylesheets/shared.css
如果不存在这样的文件,它会自动返回默认的shared.css

这一切都非常出色——我对Java脚本、图像和字体使用了相同的技术,所有内容都在预编译过程中得到了整洁的处理和打包。但是有一种我无法实现的(横向)继承;有时,标识的外观与另一个标识的外观非常相似,只有几十行不同(例如,相同的布局,但颜色方案不同),我真的希望能够做到以下几点:

资产/样式表/application.css.erb:

<% require_asset("shared.css") %>
<% require_asset("overrides.css") %>
<% require_asset("shared.css") %>
<% require_asset("overrides.css") %>
它确实试图解析ERB,但我得到了

undefined method `asset_path' for main:Object

当然,这是因为我在试图包含的文件中使用了
asset\u path(“some\u image.png”)
等。

好的,经过几个小时的搜索,我发现了-如果从GitHub链接到它,我会节省很多时间(有一个链接,但它指向#FIXME)。从链轮API文档:

  • (对象)求值(路径,选项={})
  • 读取
    路径
    并对文件运行处理器
  • 这允许您捕获一项资产的结果,并将其直接包含在另一项资产中。
宾果!我将include指令更改为:

<%= evaluate(Rails.root.join("app/assets/some_other_identity/stylesheets/overrides.css.erb")) %>


CSS被处理,结果被插入,这正是我想要的工作方式

我想也许在
文件.read()
CSS文件名中添加.erb扩展名可以解决这个问题(因为它包含在一个文件中,这个文件也是一个.erb文件),但它从来没有那么简单,不是吗?而且也不可能使用
渲染()
谢谢你的参考,帮了我的忙。
undefined method `asset_path' for main:Object
<%= evaluate(Rails.root.join("app/assets/some_other_identity/stylesheets/overrides.css.erb")) %>