2009-09-01 73 views
0
def partial(template, *args) 
    options = args.extract_options! 
    options.merge!(:layout => false) 
    if collection = options.delete(:collection) then 
    collection.inject([]) do |buffer, member| 
     buffer << erb(template, options.merge(:layout => 
     false, :locals => {template.to_sym => member})) 
    end.join("\n") 
    else 
    erb(template, options) 
    end 
end 

此方法没有文档。这似乎是让你添加额外功能到erb模板中的部分渲染的一些方法。ruby​​框架方法 - >这里发生了什么?

此Ruby代码如何工作?

我不关心这个在web框架中扮演的角色。我只是想了解Ruby语法中发生了什么。

回答

2

它的工作方式与Rails中的render :partial非常相似 - 它需要部分选项和一系列选项(例如使用部分进行渲染的对象集合)并使用这些选项渲染部分。除了这种方法似乎有硬编码ERB。如果这是来自Rails,我认为这必须是一个非常旧的方法,不是意味着使用,但还没有被删除(也许是为了兼容某些或另一个)。

options.merge!(:layout => false)实际上就是在做options[:layout] = false

options.delete(:collection)从选项散列中删除“:collection”的条目,如果存在,则返回它。如果没有收集条目,则返回nil,因此关联的if块将不会运行。如果有一个集合,它将呈现集合的每个元素的部分,并返回呈现所有元素的累积结果。如果没有集合,它只是渲染具有指定选项的部分。

+0

哇。多么好的解释。谢谢。实际上它不适用于Rails。有人将此作为Sinatra的扩展,因为Sinatra对partials有最小的特征。我只是无法弄清楚它添加了什么。但你的解释是有道理的。我认为主要功能是能够多次渲染一个集合 - 比如可以是一系列评论或订单。只是一个问题。你说“options.merge!(:layout => false)就像做选项[:layout] = false一样。”这是否意味着它总是设置:布局为'假'?有点像设置默认值重新设置? – 2009-09-01 05:20:53

+0

是的,它总是将选项[:layout]设置为false,因为您不想使用布局包裹部分。 – Chuck 2009-09-01 05:30:54

+0

明白了。再次感谢。 – 2009-09-01 05:40:55

0

要理解这一点,你需要了解这些方法的文档:

  • extract_options!
  • 可枚举/阵列:合并,合并!注入,加入,删除

一旦你理解了这些,没有什么棘手对这里的语法。你应该能够直接阅读它。

特别的东西?

相关问题