2012-01-09 40 views
0

我想有一个更系统的解决方案为我自己,以避免质量分配。替换params散列,敏感元件,以避免在Rails的质量分配

一个典型的情况是,以除去从PARAMS ID或USER_ID(经由表格自动提交)中,用current_user.id内部替换它(在#myController的创建)。

一个解决方案,我能想到的是从PARAMS哈希创建对象,然后(父和子对象)update_attributes方法与内部值替换敏感属性:

@user = User.create(:params[:user]) 
@user.update_attributes(:id => current_user.id) 
@user.profile.update_attributes(:user_id => current_user.id) 
@user.preference.update_attributes(:user_id => current_user.id) 

是否有一个较短/更干燥方式说这个?

如果偏好,配置文件等被用户的子对象(通过构建方法创建的),我怎么能写来寻找用户的外键,并自动与我传递给父值替换它们的方法?

谢谢。

回答

1

这就是attr_protectedattr_accessibledocumentation)的用途。 attr_protected会给你黑名单保护,而attr_accessible将使用白名单保护。

尽管在批量分配工作后立即调用update_attributes,但最好使用内置的保护质量分配的方法,因为每次在模型上进行质量分配时都不需要重复编码。

+0

感谢扎卡里。你能否详细说明你将如何做我想用attr_accessible做的事情?我知道attr_protected等,但我不知道如何以DRY的方式分配受保护的属性。 – AdamNYC 2012-01-09 16:36:59

+0

它与'attr_protected'工作方式相同,但它是白名单而不是黑名单。所以,如果你有一个名为'name','email',属性'password'你会做'attr_accessible:姓名,:电子邮件:password'然后你只能质量分配的3个属性。 – 2012-01-09 16:48:16

+0

对不起,但我的问题是你如何实际处理你的控制器中的这些受保护的属性。 – AdamNYC 2012-01-09 17:31:51

1

我已经通过使用早期的一个项目做到了这一点:

@user = User.create(params[:user]) do |user| 
    user.id = current_user.id 
end 

将这项工作吗?

另一种方法是检出docs并搜索:as以获取基于角色的属性。

+0

谢谢Lasse。它会起作用,但对我来说还是有点特别的。此外,我想扫描所有子对象以用current_user.id替换user_id。 – AdamNYC 2012-01-09 22:20:36