2011-02-07 18 views
0

我使用Ruby和我想知道這個代碼的某些行爲的更多信息:約on Rails的3更新一個ActiveRecord避免「attr_accessible」

@user.send :attributes=, @attrib, false 

是從here

如果我有這些參數恢復到我的控制器的一種形式:

params[:name] 
params[:surname] 
params[:email] 

,並在控制器我用

@user.send(# Avoiding 'attr_accessible' 
    :attributes=, { 
    :name => params[:name], 
    :surname => params[:surname] }, 
    false) 

@user.save 

應該只保存「名」和「姓」屬性用於@user ActiveRecord。我試過了,它按預期工作。但...

1.有可能惡意用戶可以在保存過程中設置電子郵件的值(也可以在「發送」語句中不考慮電子郵件屬性)?

2.下面的說法是正確的嗎?

調用屬性=虛假不 更新任何東西,它只是設置 屬性值,而忽略任何 attr_accessible白名單。

所以,你可以調用保存之後, 它返回布爾值你 尋找。

回答

2

您的代碼絕對不會允許惡意用戶設置電子郵件。我會建議使用下面的代碼雖然,因爲它執行了同樣的事情,更容易閱讀:

 
@user.name = params[:name] 
@user.surname = params[:surname] 
@user.save 

而且,傳遞true作爲第二個參數屬性=允許您使用attr_protected和attr_accessible保護您的屬性。您可以查看文檔here。這意味着你的陳述是正確的:傳遞false作爲第二個屬性忽略你的質量分配保護屬性。

+0

對於第2點,我指的是:'@ user.send(...)'是否足以更新'@user'對象?也就是說,使用'@ user.save'是否有必要? – user502052 2011-02-07 12:01:14