【问题标题】:How do I use a variable for a hash?如何将变量用于哈希?
【发布时间】:2011-10-18 20:40:23
【问题描述】:

在我的 Rails 应用程序中,我有以下方法:

def navigation_menu(items)
  # raise items.class.to_s
  # raise items.to_yaml
  render partial: 'global/navigation_menu', locals: items
end

如果我取消注释该方法的第一行,则会为异常文本显示“哈希”,证明items 是一个哈希。如果我取消注释第二行,则显示哈希的成员,所以我也知道它不是空的。

该方法失败并出现以下错误:

comparison of String with :navigation_menu failed

如果我将locals: items 替换为locals: { dummy_key: 'dummy value' },它会起作用。

为什么我不能使用我的items 变量来代替显式哈希?

【问题讨论】:

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


    【解决方案1】:

    这里只是一个 Ruby/Rails 新手,但我遇到了同样的问题, :locals 是一个选项散列,所以无论你传递给 :locals 什么都是选项的散列......我的意思是例如

    您需要以这种方式编码,如果您阅读 eloquent ruby​​,它会说明原因 - 除非参数是最后一个哈希,否则您可以省略大括号...

    render partial: 'global/navigation_menu', :locals => { :items => item } 
    

    或者如果你喜欢

    render partial: 'gloabl/navigation_menu', locals: { items: items }
    

    大括号必须存在于任何一种语法中,尽管我没有尝试在第一个例如不使用大括号的情况下使用大括号。然而,在第二个中,我认为这些是必需的。

    希望这会有所帮助!

    【讨论】:

    • 这是我目前的解决方法。但是,我不想要那个中介 items 变量。 :( 基本上,我试图避免不得不做local_assigns[:items]。我想我不明白为什么我不能直接将哈希传递给它,而不必当场创建一个。 +1 无论如何。
    【解决方案2】:

    你写的应该可以,我经常这样处理。

    但有一种特殊情况:将键作为字符串的哈希无法正确解释。所以在这种情况下有必要将symbolize_keys 附加到哈希:

      render partial: 'global/navigation_menu', locals: items.symbolize_keys
    

    【讨论】:

      【解决方案3】:

      我猜你需要包含箭头 '=>' 并将其放入哈希 {} 中,如下所示:

      render :partial => "global/navigation_menu", :locals => { :items => items }
      

      【讨论】:

        【解决方案4】:

        您不能简单地将本地变量作为第二个参数传递的原因是您指定了render() 的选项散列 - 在这种情况下,您的散列包含:partial。如果您查看documentationcode for render,您会看到该方法定义为:

        def render(options = {}, locals = {}, &block)
        ...
        end
        

        现在,如果你想缩短渲染部分的调用,在渲染不带选项的部分时有一个快捷方式:“如果没有传递选项哈希或 :update 指定,默认是渲染部分并使用第二个参数作为本地哈希。”您可以执行以下操作:

        render 'global/navigation_menu', items
        

        查看partials documentation 中的“呈现默认情况”以了解更多信息。

        【讨论】:

          猜你喜欢
          • 2018-04-02
          • 2018-06-10
          • 2013-03-21
          • 2012-06-19
          • 1970-01-01
          • 1970-01-01
          • 2013-04-18
          • 1970-01-01
          相关资源
          最近更新 更多