我有一个表单,允许用户更新他们的个人资料信息,但我想阻止一些信息被更改。我也想保持我的控制器代码非常简单。在我的用户控制的更新动作,我有以下代码:如何停止将表单添加到字段的用户表单?
def update
@user = Users.find params[:id]
if @user.update_attributes(params[:user])
flash[:notice] = 'Update successful.'
redirect_to user_path(@user)
else
render :action => :edit
end
end
这是非常干净和简单,我喜欢这样。然而,我不喜欢的是,用户可以在表单中添加一个字段,名称与属性相同,并用它来修改禁止的属性。有没有简单的方法来做到这一点,还是我需要设计一种方法来做到这一点?
我正在考虑的一种方法是使用所有表单元素名称的hash-based message authentication code生成散列值。此消息访问代码将是表单中的隐藏值。然后,一旦表单被提交,我会再次使用参数Hash的键的名称来计算消息访问代码(MAC)。如果两个MAC不同,或者如果参数Hash中缺少第一个MAC,我会抛出一个错误。如果在那里已经有了解决方案,我宁愿不花时间来实施。
谢谢。
我也发现了上面的内容。我知道attr_accessible和attr_protected,但我觉得他们为我的应用增加了不必要的复杂性。例如,用户不应该能够修改他们的用户名,但管理员应该能够修改每个人的用户名。像@ user.update_attribute(:login,params [:login])如果current_user.role::admin'看起来很麻烦,这种类型代码的多行需要进入我的所有控制器。在我的CanCan能力文件中已经定义了很多逻辑,所以会有相当多的代码重复。 – Max
- http://enlightsolutions.com/articles/whats-new-in-edge-scoped- mass-assignment-in-rails-3-1 – Nate
谢谢Nate,这正是我所需要的。 – Max