在Rails中的资产管道中渲染部分

时间:2012-07-25 21:42:40

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

有人知道如何在rails中的资产文件中呈现部分(或至少包含其他文件)吗?我有一个模板/文件夹设置(其中包含静态HTML文件)以及这些文件中的部分内容,我想在其他模板文件之间进行抽象和共享。

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

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

1 个答案:

答案 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文件夹中的任何内容。 因此,如果您编辑部分内容,则需要更新其内部的根文件,以便为该文件清除缓存