如何将哈希变量用于变量?

时间:2011-08-03 06:58:48

标签: ruby-on-rails ruby ruby-on-rails-3 hash

在我的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变量代替显式哈希?

4 个答案:

答案 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中的'渲染默认大小写'以获取更多信息。