2012-12-24 36 views
2

我正在使用Sinatra,但我猜這也適用於Rails(如果沒有,請刪除標籤或讓我知道,我會刪除它)。質量更新屬性

我有一個ActiveRecord :: Base類User。它具有大量的屬性,我顯示的頁面將允許某人更新特定用戶。問題是,我很難以DRY的方式實現更新功能。我的意思是,當我得到了params用POST請求,我可以這樣做:

a_user.update_attributes params 

因爲PARAMS包含其他的廢話bnch太(像:splat - 那是什麼?),它會拋出一個未知屬性錯誤。我不是要做的是:

a_user.update_attributes {:attrA => params[:attrA], 
          :attrB => params[:attrB], ...etc } 

(記住有屬性很多)

這是我應該怎麼辦呢?對我來說,出於某種原因......它感覺不對。例如,如果我有另一個需要以類似方式更新的模型,則必須重新手動重寫所有屬性。

我所尋找的是somethign像:

a_user.filter_and_update_attributes params 

其中自動filter_and_update_attributes過濾任何不良/未知屬性的PARAMS和不得不重寫了這麼多無用的代碼,我可以使用與任何型號此的任何地方。

感謝

回答

5

如果你組織你的表格是這樣的:

<form action="/users" method="post"> 
    <input id="user_email" name="user[email]" type="text"> 
    <input id="user_name" name="user[name]" type="text"> 
    <input id="user_phone_number" name="user[phone_number]" type="text"> 
    ... 
    <input id="user_email" name="user[email]" type="text"> 
    <input name="commit" type="submit" value="Submit"> 
</form> 

,你應該能夠使用PARAMS這樣的:

@user.update_attributes params[:user] 

當你的名字就像user[email]你的HTML領域,params哈希看起來像:

{ user: { email: "[email protected]", name: "Example" } } 

因此,使用params[:user]可以獲取屬於該用戶的參數的嵌套散列。

+0

哇。你真噁心!!!!!在一個很好的方式:p – 0xSina

-1

您可以使用select過濾哈希。查找您的型號的all attributes的列表,並測試該鍵是否在該列表中:

attrs = a_user.attributes.keys - User.protected_attributes.to_a 
a_user.update_attributes params.select {|k,v| attrs.include?(k)} 
+0

@downvoter你能評論我的答案有什麼問題,所以我可以從我的錯誤中學習嗎? – mgibsonbr

+1

不是downvoter,但它看起來像一個完全有效的答案給我(如果你改變'選擇(...)'到'選擇{...}'):) – Luke

+0

@Luke完成,感謝您的反饋! – mgibsonbr