2014-01-07 47 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 
相關問題