猿问

Rails:对将局部变量传递给局部变量的语法感到困惑

了解Rails在渲染局部(并将局部变量传递到局部)方面的“魔力”。


为什么这样做:


<%= 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 } %>

另外,我该如何查找这些细微差别,这样我就不必打扰别人了?


阿波罗的战车
浏览 739回答 3
3回答

阿晨1998

简短的答案是render方法查看您传入的第一个参数。如果传入哈希(包括:partial => 'foo', :locals => {blah blah blah}),则它将传入所有参数作为哈希并相应地解析它们。如果您将字符串作为第一个参数传递,则它将假定第一个参数是您的部分名称,并将其余部分作为本地变量传递。但是,在随后的调用中,它实际上是分配的:locals => your_locals_argument,在这种情况下,它是整个:locals => {locals hash},而不是{locals hash};。即你最终:locals => {:locals => {locals hash}}而不是:locals => {locals hash}。因此,我的建议是始终始终以相同的方式显式地传递值,这样就不会有问题。为了了解这一点,我直接去代码本身(ActionPack的/ LIB / base.rb,render()方法在轨道2; 3的Rails不同)。这是一个很好的锻炼。此外,不必担心在SO上“让人”生硬。这就是为什么该网站存在。我什至从中学到了一些东西。

繁星点点滴滴

如果需要指定:locals,则需要指定:partial或:template<%= render :partial => "rabbits/form", :locals => {...} %>应该管用

Qyouu

坦率地说,我只知道这些用例,因为过去两年来我一直在跟上Rails,并阅读了有关添加了新方法的公告。我通常会自己犯一个错误,但通常很容易纠正。如果您问我,这是尚未完全考虑过的Rails API的那些部分之一。这些年来,它只是积累了越来越多的语法糖,而没有贬低任何旧行为。渲染方法患有糖尿病。更糟糕的是,渲染在控制器和视图中的行为有所不同。我还将查看第一个参数的内容,以查看它是文件,模板,操作还是部分文件。如果以斜杠开头,则为文件或类似名称。我赞成尽可能使用较短的符号。因为简短的符号确实很好地传达了意图。阅读时,它通常会执行您认为的操作。写作并不是那么简单。
随时随地看视频慕课网APP

相关分类

Ruby
我要回答