1

有谁知道如何在 rails 的资产文件中渲染部分(或至少包含另一个文件)?我有一个模板/文件夹设置(其中包含静态 HTML 文件),这些文件中有一些我想在其他模板文件之间抽象和共享的点点滴滴。

render方法不适用于任何资产管道文件。我确定我可以通过找到正确的模块以某种方式包含它,但我不确定这是否可行,因为渲染模块本身可能依赖于其他模块、方法、变量。

关于如何做到这一点的任何想法?或者如果可能?

4

1 回答 1

3

我想出了我自己的解决方案。

您在 lib 文件夹中创建一个帮助文件并调用它assets_helper.rb。asset_helper 中的代码如下:

def partial(name, args = {}, dir = 'app/assets/templates')
  require 'ostruct'
  namespace = OpenStruct.new(args)
  name += '.html'
  [name + '.erb', name].each do |n|
    n = File.join(dir, n)
    next unless File.exist?(n) 
    tpl = ERB.new(File.new(n).read)
    compiled = tpl.result(namespace.instance_eval { binding })
    return compiled
  end
end

然后将该文件包含在您希望使用它的每个资产文件的顶部。在文件内部,您可以像这样使用部分命令。

<% require './lib/asset_helper.rb' %>

<!--- some HTML template --->
<%= partial('page/_partial', :var1 => true, :var2 => false) %>
<---- some other page --->

这行得通。但唯一的问题是 Rails 3.1 将缓存资产文件夹中的任何内容。因此,如果您编辑部分内容,您将需要更新它所在的根文件,以便为该文件清除缓存

于 2012-08-03T16:22:49.737 回答