有人知道如何在rails中的资产文件中呈现部分(或至少包含其他文件)吗?我有一个模板/文件夹设置(其中包含静态HTML文件)以及这些文件中的部分内容,我想在其他模板文件之间进行抽象和共享。
render
方法在任何资产管道文件中都不起作用。我确信我可以通过找到正确的模块以某种方式包含它,但我不确定这是否可行,因为渲染模块本身可能依赖于其他模块,方法和变量。
关于如何做到这一点的任何想法?或者如果可能的话?
答案 0 :(得分: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将缓存assets文件夹中的任何内容。 因此,如果您编辑部分内容,则需要更新其内部的根文件,以便为该文件清除缓存。