我正在为Rails创建用户系统,并登录,注册等......一切正常。真棒!至少,这就是我的想法。我尝试更新用户的profile
属性,但我没有发送新的密码或用户名。我在User
模型中使用它:
protected
def after_validation
self.password = Password::update(self.password)
end
Password::update
方法会为安全性设置盐和哈希密码。问题是,每当我保存时没有指定password
,Rails会尝试保存一个空密码。我在UsersController
:
# PUT /users/1
# PUT /users/1.xml
# PUT /users/1.json
def update
@user = current_user
respond_to do |format|
if @user.update_attributes(params[:user])
flash[:notice] = 'User was successfully updated.'
format.html { redirect_to(@user) }
format.xml { head :ok }
format.json { head :ok }
else
@user.password = "[FILTERED]" # Hide for security
format.html { render :action => "edit" }
format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
format.json { render :json => @user.errors, :status => :unprocessable_entity }
end
end
end
但是,我的模型验证了空密码,但仍保存了(n)(盐渍哈希)空密码。但它应该只保存:profile
字段,如果这是唯一给定的字段(以及:updated_at
字段)。
所以我的意思是,当我更新记录而不指定当前密码时,密码属性仍然保存为空字符串的哈希值。我希望update_attributes
如果没有设置密码,应该忽略密码。
有人可以帮忙吗?感谢
答案 0 :(得分:0)
我不完全确定我理解你的问题,但是如何添加:
validates_presence_of :password
def before_create
self.password = Password::update(self.password)
end
答案 1 :(得分:0)
我自己已经找到了。
我必须检查密码是否已更改:
def after_validation
self.password = Password::update(self.password) if password_changed?
end