为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

阿波罗的战车 2019-12-17 15:10:20
了解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 } %>另外,我该如何查找这些细微差别,这样我就不必打扰别人了?
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

简短的答案是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.rbrender()方法在轨道2; 3的Rails不同)。这是一个很好的锻炼。

此外,不必担心在SO上“让人”生硬。这就是为什么该网站存在。我什至从中学到了一些东西。


查看完整回答
反对 回复 2019-12-17
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

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


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

应该管用


查看完整回答
反对 回复 2019-12-17
?
Qyouu

TA贡献1786条经验 获得超11个赞

坦率地说,我只知道这些用例,因为过去两年来我一直在跟上Rails,并阅读了有关添加了新方法的公告。我通常会自己犯一个错误,但通常很容易纠正。

如果您问我,这是尚未完全考虑过的Rails API的那些部分之一。这些年来,它只是积累了越来越多的语法糖,而没有贬低任何旧行为。渲染方法患有糖尿病。

更糟糕的是,渲染在控制器和视图中的行为有所不同。我还将查看第一个参数的内容,以查看它是文件,模板,操作还是部分文件。如果以斜杠开头,则为文件或类似名称。

我赞成尽可能使用较短的符号。因为简短的符号确实很好地传达了意图。阅读时,它通常会执行您认为的操作。写作并不是那么简单。


查看完整回答
反对 回复 2019-12-17
  • 3 回答
  • 0 关注
  • 696 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信