Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 更新用户模型会重置密码吗?铁路问题_Ruby On Rails_Ruby_Ruby On Rails 3 - Fatal编程技术网

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
字段中保存用户的未加密密码和他们的加密密码