替换params哈希中的敏感元素以避免在Rails中进行批量分配

时间:2012-01-09 15:59:52

标签: ruby-on-rails hash params mass-assignment

我想为自己提供一个更系统的解决方案,以避免大规模分配。

典型的情况是从params中删除id或user_id(通过表单自动提交),并在内部用current_user.id替换它(在MyController #create中)。

我能想到的解决方案是使用params hash创建对象,然后使用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)

是否有更短/更干的方式来说这个?

如果首选项,配置文件等是用户的子对象(通过构建方法创建),我该如何编写一个方法来为用户查找其外键并自动用我传递给父级的值替换它们?

谢谢。

2 个答案:

答案 0 :(得分:1)

这是attr_protectedattr_accessibledocumentation)的用途。 attr_protected会为您提供黑名单保护,而attr_accessible会使用白名单保护。

在大规模分配工作之后立即调用update_attributes时,最好使用内置的方法来保护质量分配,因为每次在大规模分配时都不需要重复代码模型。

答案 1 :(得分:1)

我在早期项目中使用以下方法完成了这项工作:

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

这对你有用吗?

另一种方法是查看docs并搜索:as基于角色的属性。