2012-03-20 115 views
6

我在Rails中創建了一個嵌套模型,但是我希望將字段添加到控制器中的嵌套模型中。我沒有使用hidden_​​field_tag,因爲它可能被篡改。在Rails中修改參數哈希值

這裏是我的PARAMS哈希:

Parameters: {"dummy"=>{"users_attributes"=>{"0"=>{"email"=>"[email protected]", "id"=>"", "_destroy"=>"false"}, "1"=>{"email"=>"[email protected]", "id"=>"", "_destroy"=>"false"}}}, "commit"=>"Create Dummy"} 

我想是因爲有被稱爲companyid每個user_attributes下一個字段。比方說,我想companyid是「公司」,那麼我認爲這會工作:

len = params["dummy"]["users_attributes"].size 
counter = 0 
while counter < len 
    params["dummy"]["users_attributes"][counter]["companyid" => "company"] 
    counter = counter + 1 
end 

但是,我得到「未定義的方法`[]」爲無:NilClass」錯誤的,而第一線循環。我不完全確定爲什麼。

有人可以幫助我,所以我可以修改參數哈希?編輯: 所以,我終於弄明白了。我沒有真正使用任何解決方案。首先,我爲companyid設置一個hidden_​​field標記爲空白。然後,在我的控制,我把:

params["dummy"]["users_attributes"].each do |key, val| 
    params["dummy"]["users_attributes"][key]["companyid"] = "company" 
end 

不是最優雅的代碼,但它會工作。

回答

4

params散列是特殊的,因爲(特別是對於窗體)它與它所關聯的模型一對一映射,並且Rails期望那裏有一個數據庫列或者一個方法有這個名字的模型。

隱藏字段是獲取附加數據問題的典型解決方案,但如果您不希望用戶看到這些字段,則會遇到HTTP無狀態的問題。所以在這種情況下,session[:something]是你的朋友。在顯示可能具有隱藏數據的表單或頁面之前,請將數據添加到會話變量(首先對其進行加密),然後在用戶提交表單時讀取(並解密)。或者,您可以將其保存在數據庫表中,並在會話中僅放置行ID,以便在發佈表單時讀回數據。

如果數據模型的一部分,但您只是不想顯示它,您可以只顯示用戶可以在視圖中看到的部分,然後在其中查看其餘部分控制器在用戶提交表單或請求時的操作。

如果數據不是敏感你可以確保申報用戶可以在各自的車型attr_accessible更改值(防止質量分配),並把其他人隱藏字段。

+0

我給你的檢查,因爲你深入討論隱藏領域讓我找出解決方案。謝謝! – NielMalhotra 2012-03-20 20:54:56

+2

我缺乏正確性,我彌補了冗長。我應該是一名Java程序員! (哦,等等,我是)。那麼,解決方案是什麼? – 2012-03-20 23:48:20

+0

它在原始文章的編輯中:f.hidden_​​field:表單中的companyid,然後是上面的代碼片段 – NielMalhotra 2012-03-21 05:38:41

0

這看起來醜陋,我不明白是怎麼回事,但你的錯誤是:

len = params["dummy"]["users_attributes"].size 
counter = 0 
while counter < len 
    params["dummy"]["users_attributes"][counter] = { "companyid" => "company" } 
    counter = counter + 1 
end 

我相信你應該在這裏使用accepts_nested_attributes_for和控制器初始化新的公司,而不是這個醜陋的代碼

http://railscasts.com/episodes/196-nested-model-form-part-1

http://railscasts.com/episodes/197-nested-model-form-part-2

0

這不是哈希的工作方式。試試這個:

params["dummy"]["users_attributes"][counter]["companyid"] = "company" 

編輯除了fl00r的回答,是的,你必須設置[ 「companyid」]爲{}第一。