我对 Rails 很陌生,我正在开发一个涉及用户帐户的小型应用程序。目前,用户可以更改/更新他们的姓名、电子邮件和密码。用户也有一个唯一的用户名,但我想阻止用户更改它。我将如何防止这种情况发生?
我已将用户名包含在 attr_accessible 中,以便在注册时创建它,但是一旦用户名出现,我想以某种方式将其删除。到目前为止,我唯一的限制是缺少用户名编辑表单,但我知道这不会阻止有创意的用户发出 PUT 请求来更改它。
我对 Rails 很陌生,我正在开发一个涉及用户帐户的小型应用程序。目前,用户可以更改/更新他们的姓名、电子邮件和密码。用户也有一个唯一的用户名,但我想阻止用户更改它。我将如何防止这种情况发生?
我已将用户名包含在 attr_accessible 中,以便在注册时创建它,但是一旦用户名出现,我想以某种方式将其删除。到目前为止,我唯一的限制是缺少用户名编辑表单,但我知道这不会阻止有创意的用户发出 PUT 请求来更改它。
最简单的方法是在控制器的更新操作中删除参数,然后再将它们传递给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
或者,您可以使用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
只需反转任何尝试的更改...
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