Ruby on rails 如何防止用户在创建帐户后更改用户名

Ruby on rails 如何防止用户在创建帐户后更改用户名,ruby-on-rails,authentication,Ruby On Rails,Authentication,我是rails的新手,正在开发一个涉及用户帐户的小应用程序。目前,用户可以更改/更新其姓名、电子邮件和密码。用户也有一个唯一的用户名,但我想阻止用户更改它。我该如何预防这种情况 我已经在attr_accessible中包含了用户名,以允许在注册时创建它,但我想在用户名出现后以某种方式删除它。到目前为止,我唯一的限制是缺少用户名编辑表单,但我知道这不会阻止创造性用户发出更改它的PUT请求。最简单的方法是在控制器的更新操作中删除参数,然后再将其传递到update_attributes函数中,如下所示

我是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
或者,您也可以使用动态质量分配安全性,如中所示,其要点是覆盖模型中的质量分配授权器函数,以添加您希望可以访问质量分配的任何额外属性。利用这个想法,你可以做如下事情:

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