2011-02-07 42 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