2011-08-03 63 views
0

在我的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: itemslocals: { dummy_key: 'dummy value' },它的工作原理。

爲什麼我不能用我的items變量來替代明確哈希?

回答

1

你寫什麼應該工作,我經常進行這種方式。

有一個特定的情況下,雖然:具有鍵散列作爲字符串不能被正確地解釋。因此,它是在這種情況下,有必要追加symbolize_keys到哈希:

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

僅有的Ruby/Rails福利局在這裏,但我有同樣的問題,:當地人是一個選項哈希,所以無論你傳遞給:當地人會是一個hash選項......我的意思是如

你需要這樣的代碼,如果你讀雄辯紅寶石,它指出爲什麼 - 除非參數是最末尾的散列可以省略大括號...

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

,或者如果你喜歡

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

括號必須有在任何語法,雖然我沒有不使用大括號在第比如嘗試然而,第二,我相信這些都是必需的。

希望這有助於!

+0

這是我目前的解決方法。但是,我不想要那個中介'item'變量。':''(基本上,我試圖避免必須執行'local_assigns [:items]'。我想我不明白爲什麼我不能直接傳遞一個散列,而不必現場創建一個散列無論如何''+ 1'。 – ClosureCowboy

1

我猜你需要包括箭頭「=>」並把它放在一個哈希{}這樣的:

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

的原因,你不能簡單地傳遞當地人作爲第二個參數是你指定的選項的散列render() - 在這種情況下,你的哈希包含:partial。如果你看看在documentationcoderender,你會看到,該方法被定義爲:現在

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

,如果你想縮短呼叫呈現一個部分了一下,有一個渲染時的部分不帶選項快捷鍵:「如果沒有選項哈希傳遞或:更新指定,默認是渲染的部分,並使用第二個參數當地人哈希值。」你可以做到以下幾點:

render 'global/navigation_menu', items 

退房「再現默認情況下」在partials documentation以獲得更多信息。