Ruby on rails 更新用户模型会重置密码吗?铁路问题
在我的控制器中,我尝试更新用户实例的Ruby on rails 更新用户模型会重置密码吗?铁路问题,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,在我的控制器中,我尝试更新用户实例的rank属性(整数)。例如,从1到2 我通过以下方式做到这一点: @user = User.find(params[:id]) @user.rank = 2 @user.save(:validate => false) 由于某种原因,被保存用户的密码会被删除,这样他们就可以不用密码登录到我的网站。我尝试过使用和不使用:validate=>false参数 有什么原因吗?帮忙?非常感谢 模型代码 类用户true验证,并添加一个条件以仅在密码存在时运行其他验
rank
属性(整数)。例如,从1到2
我通过以下方式做到这一点:
@user = User.find(params[:id])
@user.rank = 2
@user.save(:validate => false)
由于某种原因,被保存用户的密码会被删除,这样他们就可以不用密码登录到我的网站。我尝试过使用和不使用:validate=>false
参数
有什么原因吗?帮忙?非常感谢
模型代码
类用户validates :login, :presence => true, :length => { :maximum => 15, :minimum => 4 }, :uniqueness => true
validates :fname, :presence => true, :length => {:minimum => 2 }
validates :lname, :presence => true, :length => {:minimum => 2 }
validates :email, :presence => true, :format => { :with => email_filter}, :uniqueness => { :case_sensitive => false }
validates :password, :presence => true, :confirmation => true, :length => { :within =>4..40 }
validates :lane_id, :presence => true
before_save :encrypt_password
has_many :reports
has_many :accomplishments
belongs_to :lane
def has_password?(submitted_password)
encrypted_password == encrypt(submitted_password)
end
def self.authenticate(login, submitted_password)
user = find_by_login(login)
return nil if user.nil?
return user if user.has_password?(submitted_password)
end
def self.authenticate_with_salt(id, cookie_salt)
user = find_by_id(id)
(user && user.salt == cookie_salt) ? user : nil
end
def current_report
report = (Report.order("created_at DESC")).find_by_user_id(@user.id)
end
private
def encrypt_password
self.salt = make_salt if new_record?
self.encrypted_password = encrypt(password)
end
def encrypt(string)
secure_hash("#{salt}--#{string}")
end
def make_salt
secure_hash("#{Time.now.utc}--#{password}")
end
def secure_hash(string)
Digest::SHA2.hexdigest(string)
end
结束您有一个
前置过滤器
,每次保存模型时都会对密码进行加密。不要在过滤器之前使用,
使用以下内容:
def password=(new_password)
self.salt = make_salt if new_record?
self.encrypted_password = encrypt(new_password)
end
您有一个
before\u过滤器
,每次保存模型时都会对密码进行加密。不要在过滤器之前使用,
使用以下内容:
def password=(new_password)
self.salt = make_salt if new_record?
self.encrypted_password = encrypt(new_password)
end
您只想在密码存在时加密密码,因此在回调中添加一个条件
before_save :encrypt_password, :unless => "password.blank?"
此外,您不希望每次更新用户记录时都验证密码。您可以删除:presence=>true
验证,并添加一个条件以仅在密码存在时运行其他验证
validates :password, :confirmation => true, :length => { :within =>4..40 }, :unless => "password.blank?"
您只想在密码存在时加密密码,因此在回调中添加一个条件
before_save :encrypt_password, :unless => "password.blank?"
此外,您不希望每次更新用户记录时都验证密码。您可以删除:presence=>true
验证,并添加一个条件以仅在密码存在时运行其他验证
validates :password, :confirmation => true, :length => { :within =>4..40 }, :unless => "password.blank?"
我知道这已经很晚了,但实际上我只是偶然发现了这篇写在2009年的文章,但仍然为我工作,以防其他通过谷歌来到这里的人也有同样的问题
before_save :encrypt_password, :if => :password_changed?
我遇到了同样的问题,我的密码会在更新时重新加密,但我只想在用户创建时加密
在保存之前,我一直在寻找
的替代方案,但没有一个真正起作用。然而,这确实是这样,我所要做的就是添加if条件。这篇文章写得很好。我知道这已经很晚了,但实际上我只是偶然发现了这篇文章,这篇文章是2009年写的,但仍然对我有用,以防其他通过谷歌来到这里的人也会遇到同样的问题
before_save :encrypt_password, :if => :password_changed?
我遇到了同样的问题,我的密码会在更新时重新加密,但我只想在用户创建时加密
在保存
之前,我一直在寻找的替代方案,但没有一个真正起作用。然而,这确实是这样,我所要做的就是添加if条件。它工作得很好。您有任何前后过滤器吗?没有,只有默认的标准rails表单。嗯,我有一个前保存:加密密码。这样行吗?我在调用:validate=>false…发布你的用户模型的代码好吧,我猜是因为我正在保存用户,并且有一个before\u save过滤器来加密一个“不存在”的密码,它使其为空?你有任何before或after过滤器吗?不,只有默认的标准rails表单嗯,我有before\u save:encrypt\u密码。这样行吗?我正在调用:validate=>false…发布您的用户模型的代码好吧,我猜是因为我正在保存用户,并且有一个before\u save过滤器来加密“不存在”的密码,它会使其为空?所以不要使用before\u save:encrypt\u密码“那么?没错<每次保存模型时都会调用code>before\u save
,并且只有在更新密码时才会调用此代码。如果我取消before\u save调用,则整个加密过程永远不会发生,因为“encrpyt\u password”在顶部只调用一次。。所以我还是有点困惑。每次你设置密码时,password=
都会被调用,如果你看一下我的代码,你就会看到你得到了加密的密码。所以我完全去掉了“保存前:加密密码”行,并将“encrpyt\u password”函数重命名为“password=(新密码)但当我尝试更新时,一切都没有改变。我做的更改对吗?所以不要使用before_save:encrypt_password“then”?确切地说。before_save
会在每次保存模型时调用,并且只有在更新密码时才会调用此代码。如果我取消before_save调用,那么整个加密过程将从“encrpyt_password”起永远不会发生“在顶部只调用一次。。所以我还是有点困惑。每次你设置密码时,password=
都会被调用,如果你看一下我的代码,你就会看到你得到了加密的密码。所以我完全去掉了“保存前:加密密码”行,并将“encrpyt\u password”函数重命名为“password=(新密码)但当我尝试更新时,一切都没有改变。我做的改变对吗?由于某些原因,Rails 3.2.2并不能真正起作用。密码不再是空字符串。每次我用此代码更改用户对象时,加密的密码字符串都是不同的,而如果密码为空,则应该是相同的。password
是否是模型上的虚拟属性(这是典型的实现)?如果是这样,您必须在代码的某个地方设置密码。如果没有,那么需要进行比评论更为冗长的讨论。不,这是真正的数据库字段。但我还是不明白。当Rails在DB上执行UPDATE时,它只更新查询中的字段,而不更新密码。我正在从PHP转换过来,在那里我主要执行来自PHP类的直接查询,所以我仍然不太习惯,或者首先,听起来你好像在password
字段中保存用户的未加密密码和他们的加密密码