-1

我对 Rails 很陌生,我正在开发一个涉及用户帐户的小型应用程序。目前,用户可以更改/更新他们的姓名、电子邮件和密码。用户也有一个唯一的用户名,但我想阻止用户更改它。我将如何防止这种情况发生?

我已将用户名包含在 attr_accessible 中,以便在注册时创建它,但是一旦用户名出现,我想以某种方式将其删除。到目前为止,我唯一的限制是缺少用户名编辑表单,但我知道这不会阻止有创意的用户发出 PUT 请求来更改它。

4

2 回答 2

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

或者,您可以使用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
于 2012-07-14T02:04:00.467 回答
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
于 2012-07-14T02:14:35.023 回答