在rails中,更新模型時,如何在使用如下調用時阻止模型的某些屬性更新:防止某些屬性更新?
@user.update_profile params[:user]
因爲任何人都可以創建名稱爲'password'的表單輸入,如何過濾允許更新的屬性集?
這是attr_XXX的用途嗎?
在rails中,更新模型時,如何在使用如下調用時阻止模型的某些屬性更新:防止某些屬性更新?
@user.update_profile params[:user]
因爲任何人都可以創建名稱爲'password'的表單輸入,如何過濾允許更新的屬性集?
這是attr_XXX的用途嗎?
您正在尋找attr_accessible
。它允許您指定哪些屬性可以通過批量更新設置(如update_attributes
),但您仍然可以設置「手動」屬性(即@user.attribute = ...
)。請參閱The importance of attr_accessible in Ruby on Rails。
好吧,這樣可以防止表單帖子等大量更新吧? – Blankman 2010-10-06 02:44:59
@Blankman更正,任何未被指定爲可訪問的屬性都不能通過'params'更新。 – 2010-10-06 02:46:08
您正在尋找attr_protected黑名單,您不希望在批量更新中更改任何屬性。 將它扔到你的模型中,並給它一個黑名單的屬性符號列表。
class User < ActiveRecord::Base
attr_protected :password
end
或者,您可以使用attr_accessible採取白名單方法,只有在給定的屬性可以更新時,一次更新整個記錄。其他每個屬性都將受到保護。如果它直接分配給在
@user.password = "not secure"
請注意'attr_protected'和'attr_accessible'(我在回答中提到過)是同一枚硬幣的兩面。 'attr_accessible'使你列出你想**具有批量更新的屬性; 'attr_protected'列出你不想**可更新的屬性。 – 2010-10-06 02:46:39
但是,使用'attr_accessible',如果您向模型添加了更多屬性,則不必擔心它們可以訪問,除非您指定它們;使用'attr_protected',任何新的屬性都可以訪問。當然,這是正確的答案取決於你期望發生的事情(儘管有些人認爲最好明確列出你想做的事情,以便沒有任何意外)。 – 2010-10-06 02:48:57
@Daniel Vandersluis:是的這是事實。使用attr_accessible的白名單比使用attr_protected的黑名單更安全。但問題措辭的方式意味着黑名單方法更受歡迎。 – EmFi 2010-10-06 02:51:32
白名單黑名單VS
N.B受保護的屬性仍然可以被覆蓋,建議白名單。 – Swanand 2010-10-06 04:59:57