2014-01-07 46 views
0

我有一个客户端的编辑窗体。也可以更改密码,但每次更改其他设置时,您都不想更改(和/或重新输入)密码。为了避免更新密码,我试过这个:Ruby on rails更新客户端,使用和不使用新密码

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 

所以我们的想法是检查密码字段是否设置。如果已设置,请用新密码更新,否则请勿更新密码。但每次我点击提交(并将密码字段留空),表单验证表明密码是短的。

是否有可能为此问题提供工作/更优雅的解决方案?

编辑:验证ON MODEL:

attr_accessor :is_admin_applying_update 
attr_accessor :plain_password 

VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][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 
+0

是在模型验证什么? – evkline

+0

我编辑了问题 – user1990524

+0

请注意,您的VALID_EMAIL_REGEX不是很有效。例如,它允许'email @ .. c'。它甚至允许'。@ .. c' – Jon

回答

0

请记住,你真的没有在模型中password属性。密码存储在名为password_digest的字段中。

只有在给出密码和password_confirmation后,才应该验证password属性。您可以在模型验证中执行此操作,而不是从params哈希中删除。

另外,如果存在密码,则应验证是否存在password_confirmation。

0

添加一个虚拟属性skip_password像色器件采用

在模型

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 
相关问题