我有一个允许用户更新其个人资料信息的表单,但我想阻止某些信息被更改。我还想保持我的控制器代码非常简单。在我的用户控制器的更新操作中,我有以下代码:
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,我会抛出错误。如果已经有一个简单的解决方案,我宁愿不花时间实现这个。
感谢。
答案 0 :(得分:1)
在您的模型上,您可以使用attr_protected或attr_accessible在通过批量分配设置时将属性列入黑名单或白名单(例如提交表单时)。
答案 1 :(得分:1)
如果您在模型中使用attr_protected :protectedcolumn
(黑名单)或attr_accessible :safecolumn
(白名单),则Rails会阻止批量分配。有关此主题的更多信息,请参阅Ruby on Rails Security Guide (Section 6.1)