Rails:混淆了将本地语言传递给partials的语法

理解Rails在渲染partials(以及传入局部variables)方面“魔术”。

为什么这个工作:

<%= render "rabbits/form" %> 

而这项工作:

 <%= render "rabbits/form", :parent => @warren, :flash => flash %> 

但是这不起作用:

 <%= render "rabbits/form", :locals => { :parent => @warren, :flash => flash } %> 

但是这样做:

 <%= render :partial =>"rabbits/form", :locals => { :parent => @warren, :flash => flash } %> 

另外,如何查看这些细微差别,所以我不需要打扰人们呢?

简单的回答是渲染方法看你传递的第一个参数。如果你传入一个散列(包括:partial => 'foo', :locals => {blah blah blah} ),那么它会传递所有的你的论点作为一个散列,并相应地parsing它们。

如果你传入一个string作为你的第一个参数,它假定第一个参数是你的部分名称,并将剩下的作为你的本地。 然而,在随后的调用中,它实际上分配了:locals => your_locals_argument ,在本例中是整个:locals => {locals hash} ,而不仅仅是{locals hash} ; 即最终:locals => {:locals => {locals hash}} ,而不是:locals => {locals hash}

所以我的build议就是始终以同样的方式明确地传递值,而且不会有任何问题。 为了了解这一点,我直接去了代码本身(Rails 2中的actionpack / lib / base.rbrender()方法; Rails 3是不同的)。 这是一个很好的练习。

此外,不要担心“打扰”SO上的人。 这就是为什么这个网站存在。 我甚至从中学到了一些东西。

如果您需要指定:locals,则需要指定:partial或:template

 <%= render :partial => "rabbits/form", :locals => {...} %> 

应该pipe用

为了获得更高的性能,我只知道这些用例,因为在过去的几年里我一直在跟踪Rails,并且读了一些新的方法。 我经常自己犯了一个错误,但通常很容易纠正。

如果你问我的话,Rails API的其中一部分还没有被彻底的思考过。 这些年来积累了越来越多的语法糖,没有贬低任何旧的行为。 渲染方法有糖尿病。

更糟的是,渲染器在控制器和视图中的行为是不同的。 我也看第一个参数的内容,看看它是一个文件,模板,行动还是部分。 如果它以斜杠开始,那么它是一个文件,或类似的东西。

我赞成尽可能使用较短的符号。 因为简短的符号很好地传达了这个意图。 阅读时,通常会按照您的想法进行。 写它不是那么简单。

以下是来自http://api.rubyonrails.org/classes/ActionView/Rendering.html#method-i-render的渲染方法的源代码:;

 def render(options = {}, locals = {}, &block) case options # Here is your last case when Hash if block_given? _render_partial(options.merge(:partial => options.delete(:layout)), &block) elsif options.key?(:partial) _render_partial(options) else template = _determine_template(options) lookup_context.freeze_formats(template.formats, true) _render_template(template, options[:layout], options) end when :update update_page(&block) else # here the first three cases _render_partial(:partial => options, :locals => locals) end end 

希望这个帮助!

Interesting Posts