Ruby on rails RubyonRails更新客户机,使用和不使用新密码

Ruby on rails RubyonRails更新客户机,使用和不使用新密码,ruby-on-rails,validation,Ruby On Rails,Validation,我有一个客户的编辑表单。也可以更改密码,但当然,您不希望每次更改其他设置时都更改(和/或重新输入)您的密码。为了避免更新密码,我尝试了以下方法: def client_update_params if admin? == true params.require(:client).permit(:name, :email,:company_name, :address_street,:address_number,:ad

我有一个客户的编辑表单。也可以更改密码,但当然,您不希望每次更改其他设置时都更改(和/或重新输入)您的密码。为了避免更新密码,我尝试了以下方法:

def client_update_params
  if admin? == true
    params.require(:client).permit(:name, :email,:company_name,
                                 :address_street,:address_number,:address_city,
                                 :address_zip,:address_country,:billing_informations)
  else
    if params[:client][:password].blank?

      params[:client].delete("password")
      params[:client].delete("password_confirmation")

      params.require(:client).permit(:name, :email,:company_name,
                                 :address_street,:address_number,:address_city,
                                 :address_zip,:address_country)
    else

      params.require(:client).permit(:name, :email,:company_name,
                                 :address_street,:address_number,:address_city,
                                 :address_zip,:address_country,
                                 :password,:password_confirmation)
    end
  end

end
因此,我们的想法是检查密码字段是否已设置。如果已设置,请使用新密码更新,否则不要更新密码。但每次我点击submit(并将password字段留空),表单验证都会说密码太短了

对于这个问题是否有一个有效/更优雅的解决方案

编辑:模型上的验证:

attr_accessor :is_admin_applying_update 
attr_accessor :plain_password

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i



before_save { self.email = email.downcase }
before_create :create_remember_token

validates :name, presence: true, length: { maximum: 50 }

validates :email, presence: true, 
                format: { with: VALID_EMAIL_REGEX },
                uniqueness: { case_sensitive: false }

validates :company_name,presence:true

validates :address_street,presence:true 

validates :address_number,presence:true

validates :address_city,presence:true

validates :address_zip,presence:true

validates :address_country,presence:true

validates :billing_informations,presence:true

has_secure_password
validates :password, length: { minimum: 6 }, :unless => :is_admin_applying_update

def Client.new_remember_token
    SecureRandom.urlsafe_base64
end

def Client.encrypt(token)
    Digest::SHA1.hexdigest(token.to_s)
end


private

  def create_remember_token
    self.remember_token = Client.encrypt(Client.new_remember_token)
  end  

请记住,您的模型中实际上没有
password
属性。密码加密存储在名为
password\u digest
的字段中

只有在给出密码和密码确认时,您才应该验证
password
属性。您可以在模型验证中执行此操作,而不是从params散列中删除内容


此外,如果存在密码,则应验证密码确认是否存在。

添加虚拟属性跳过密码,就像设备使用的那样

模型中

attr_accessible :skip_password

validates :password, length: { minimum: 6 }, :unless => :skip_password

def skip_password=(value)
   @skip = value
end

def skip_password
   @skip
end
内部控制器

@client.skip_password = true

模型上的验证是什么?我编辑了这个问题作为旁注,你的有效电子邮件REGEX不是很有效。它允许
email@..c
例如。它甚至允许
@..c