2013-06-27 69 views
17

型號: 帖子和用戶軌道4個強參數 - 處理丟失的模型PARAMS哈希

帖子belongs_to的:用戶
用戶的has_many:帖子

簡單。

假設有一些用戶存在,我們訪問Post的編輯頁面。

<%= form_for @post do |f| %> 

...

<% User.all.each do |user| %> 
    <div><%= f.radio_button "user_id", user.id %></div> 
<% end %> 

...

郵政的控制器利用軌道4點強的參數。

params.require(:post).permit(:user_id) 

假設編輯帖子表單只有單選按鈕作爲字段。

問題:ActionController :: ParameterMissing異常被拋出。 param not found:post

原因是Post params散列從來沒有被創建,導致上述異常被拋出。空單選按鈕,例如與空文本字段不同,不會觸發要創建的模型的參數哈希。

如果Post模型要求user_id有效,該怎麼辦?當然,人們會希望再次呈現視圖,以及郵政無法保存的原因。

問題:遵循Rails約定,處理這種情況的優雅方法是什麼?

UPDATE:

集思廣益這個進一步,我敢肯定,有可能是大量的,其產生這一問題的其他情形;它不一定對應於單選按鈕。

+0

我有一個奇怪的問題......我得到的模型哈希沒有找到相同的參數,但是我測試的是一個form_for @user和兩個用戶的字段,就是這樣。我的網址恰好使用用戶名,我會認爲它缺少身份證或其他東西。但我有我的項目的另一部分做同樣的事情。唯一的區別是我從頭建立這種形式,而不是通過腳手架... – dtc

回答

28

我有一個類似的問題,並不喜歡這些答案太多。在軌文件(http://guides.rubyonrails.org/action_controller_overview.html#more-examples)我看到了以下解決方案:

params.fetch(:blog, {}).permit(:title, :author) 

有效您提供的默認{},這似乎工作不夠好(我的情況,至少)。

應用到你的代碼,你必須:

params.fetch(:post, {}).permit(:user_id) 

我認爲這是合理的清潔,似乎在我的代碼工作。

+1

太棒了!這是我一直在尋找的解決方案。 – Ben

+0

謝謝PaulL。你救了我的命。我也嘗試使用Ben的解決方案,但它給了我這個錯誤:當分配屬性時,你必須傳遞一個散列作爲參數。 – cyonder

4

這是我的直接解決方案...雖然它看起來有點愚蠢,因爲如果你明確地在後控制器中並且無論如何需要它們,爲什麼還要檢查後參數。看起來很違反直覺。這真的是最好的方法嗎?

params.require(:post).permit(:user_id) if params[:post] 
+0

是的這個工程,但我不明白爲什麼 –

+2

@ConnorLeech它的工作原因是因爲原始問題是params [:post]沒有創建,並且如果在運行強參數方法之前簡單地檢查它。如果參數根本不存在,則方法簡單地返回nil。如果不是所有的模型更新方法,Nil都可以工作,所以一切都可以實現。我不喜歡它,因爲如果後參數不存在(強參數的全部要點之一),則拋出異常。一切都沒有發生,我不會考慮預期的行爲。 – Ben

+0

它將需要檢查控制器中的params [:post]以進一步處理value params [:post] [:user_id] –