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