2010-10-06 104 views
5

在rails中,更新模型時,如何在使用如下調用時阻止模型的某些屬性更新:防止某些屬性更新?

@user.update_profile params[:user] 

因爲任何人都可以創建名稱爲'password'的表單輸入,如何過濾允許更新的屬性集?

這是attr_XXX的用途嗎?

+1

白名單黑名單VS

N.B受保護的屬性仍然可以被覆蓋,建議白名單。 – Swanand 2010-10-06 04:59:57

回答

6

您正在尋找attr_accessible。它允許您指定哪些屬性可以通過批量更新設置(如update_attributes),但您仍然可以設置「手動」屬性(即@user.attribute = ...)。請參閱The importance of attr_accessible in Ruby on Rails

+0

好吧,這樣可以防止表單帖子等大量更新吧? – Blankman 2010-10-06 02:44:59

+0

@Blankman更正,任何未被指定爲可訪問的屬性都不能通過'params'更新。 – 2010-10-06 02:46:08

4

您正在尋找attr_protected黑名單,您不希望在批量更新中更改任何屬性。 將它扔到你的模型中,並給它一個黑名單的屬性符號列表。

class User < ActiveRecord::Base 
    attr_protected :password 
end 

或者,您可以使用attr_accessible採取白名單方法,只有在給定的屬性可以更新時,一次更新整個記錄。其他每個屬性都將受到保護。如果它直接分配給在

@user.password = "not secure" 
+2

請注意'attr_protected'和'attr_accessible'(我在回答中提到過)是同一枚硬幣的兩面。 'attr_accessible'使你列出你想**具有批量更新的屬性; 'attr_protected'列出你不想**可更新的屬性。 – 2010-10-06 02:46:39

+0

但是,使用'attr_accessible',如果您向模型添加了更多屬性,則不必擔心它們可以訪問,除非您指定它們;使用'attr_protected',任何新的屬性都可以訪問。當然,這是正確的答案取決於你期望發生的事情(儘管有些人認爲最好明確列出你想做的事情,以便沒有任何意外)。 – 2010-10-06 02:48:57

+0

@Daniel Vandersluis:是的這是事實。使用attr_accessible的白名單比使用attr_protected的黑名單更安全。但問題措辭的方式意味着黑名單方法更受歡迎。 – EmFi 2010-10-06 02:51:32