我对rails很新,我正在开发一个涉及用户帐户的小应用程序。目前,用户可以更改/更新其姓名,电子邮件和密码。用户还有一个唯一的用户名,但我想阻止用户更改它。我该如何防止这种情况?
我在attr_accessible中包含了用户名以允许在注册时创建它,但是我想在用户名出现后以某种方式删除它。我到目前为止唯一的限制是缺少用户名编辑表单,但我知道这不会阻止创意用户发出PUT请求来更改它。
答案 0 :(得分:2)
最简单的方法是在控制器的更新操作中将参数传递到update_attributes
函数之前删除它,如下所示:
#UsersController
def update
params[:user].delete(:username)
@user = user.find(params[:id])
if @user.update_attributes(params[:user])
flash[:notice] = "Successfully updated user."
redirect_to @user
else
render :action => 'edit'
end
end
或者,您可以使用this RailsCast中显示的动态质量分配安全性,这个要点是您覆盖模型中的mass_assignment_authorizer
函数以添加您想要访问的任何额外属性大规模任务。使用这个想法,你可以做类似的事情:
class User < ActiveRecord::Base
attr_accessible #what ever other stuff you wan't to accessable
private
def mass_assignment_authorizer
new_record? ? super + [:username] : super
end
end
答案 1 :(得分:0)
只需撤消任何尝试的更改......
class User
before_update :revert_username_if_changed, :if => Proc.new { |u| u.username_changed? }
def revert_username_if_changed
self.username = self.username_was
end
end