在我的Rails应用程序中,我有以下方法:
def navigation_menu(items)
# raise items.class.to_s
# raise items.to_yaml
render partial: 'global/navigation_menu', locals: items
end
如果我取消注释方法的第一行,则会显示异常文本的“Hash”,证明items
是一个哈希值。如果我取消注释第二行,则显示散列的成员,所以我也知道它不是空的。
该方法因以下错误而失败:
comparison of String with :navigation_menu failed
如果我将locals: items
替换为locals: { dummy_key: 'dummy value' }
,则可行。
为什么我不能使用items
变量代替显式哈希?
答案 0 :(得分:2)
这里只是一个Ruby / Rails newb,但是我有同样的问题,:locals是一个选项哈希,所以无论你传递给什么:locals都是一个选项的哈希...我的意思是例如
你需要以这种方式编码,如果你读了雄辩的红宝石,它就说明了原因 - 除非参数是最后一个哈希,你可以省略大括号......
render partial: 'global/navigation_menu', :locals => { :items => item }
或者如果您愿意
render partial: 'gloabl/navigation_menu', locals: { items: items }
大括号必须以任一语法存在,尽管我没有尝试过不使用第一个大括号中的大括号。然而,在第二种情况下,我认为这些是必需的。
希望这有帮助!
答案 1 :(得分:1)
我猜您需要包含箭头'=>'并把它放在这样的哈希{}中:
render :partial => "global/navigation_menu", :locals => { :items => items }
答案 2 :(得分:1)
你写的内容应该有用,我经常这样做。
但是有一种特殊情况:具有键作为字符串的哈希值无法正确解释。因此,在这种情况下,有必要将symbolize_keys
附加到哈希:
render partial: 'global/navigation_menu', locals: items.symbolize_keys
答案 3 :(得分:1)
您无法简单地将locals作为第二个参数传递的原因是您要为render()
指定一个选项哈希 - 在这种情况下,您的哈希包含:partial
。如果您查看render
的{{3}}和documentation,您会看到该方法定义为:
def render(options = {}, locals = {}, &block)
...
end
现在,如果你想缩短调用以稍微渲染一个部分,那么在渲染没有选项的部分时会有一个快捷方式:“如果没有传递选项哈希或者:指定了更新,则默认是渲染部分并使用第二个参数作为本地散列。“您可以执行以下操作:
render 'global/navigation_menu', items
请查看code中的'渲染默认大小写'以获取更多信息。