2017-02-26 18 views
0

データベースに保存する前に、2つのフィールドを暗号化するモデルにbefore_saveコールバックがあります。before_save複数回呼び出しを作成する

class Account < ActiveRecord::Base 
    before_save :encrypt_credentials, if: "!username.blank? && !password.blank?" 

    def encrypt_credentials 
    crypt = ActiveSupport::MessageEncryptor.new(ENV['KEY']) 
    self.username = crypt.encrypt_and_sign(username) 
    self.password = crypt.encrypt_and_sign(password) 
    end 

    def decrypted_username 
    crypt = ActiveSupport::MessageEncryptor.new(ENV['KEY']) 
    crypt.decrypt_and_verify(username) 
    end 

    def decrypted_password 
    crypt = ActiveSupport::MessageEncryptor.new(ENV['KEY']) 
    crypt.decrypt_and_verify(password) 
    end 
end 

状況はDevise models run before_save multiple times?と非常によく似ています。 Model.create!(...)を呼び出すと、暗号化が必要な2つのフィールドがあり、before_saveは2回呼び出され、2回暗号化されたフィールドに終わります。

Account.create!(
{ 
    username: ENV['USERNAME'], 
    password: ENV['PASSWORD'] 
}) 

なぜbefore_saveが複数回呼び出されますか?私は上記のリンク先の解決策が気に入らず、新しい/ビルドの後に保存をしたくありません。

答えて

0

私はaccount = Account.create!を呼び出した後、account.foo = bar; account.saveというモデルにsave!backというコードをもうけました。これはbefor_saveをもう一度呼び出して - 私のフィールドを暗号化しました。私はこのようなもので終わった:

class Account < ActiveRecord::Base 
    before_save :encrypt_username, if: :username_changed? 
    before_save :encrypt_password, if: :password_changed? 

    def encrypt_username 
    crypt = ActiveSupport::MessageEncryptor.new(ENV['KEY']) 
    self.username = crypt.encrypt_and_sign(username) 
    end 

    def encrypt_password 
    crypt = ActiveSupport::MessageEncryptor.new(ENV['KEY']) 
    self.password = crypt.encrypt_and_sign(password) 
    end 

    def decrypted_username 
    crypt = ActiveSupport::MessageEncryptor.new(ENV['KEY']) 
    crypt.decrypt_and_verify(username) 
    end 

    def decrypted_password 
    crypt = ActiveSupport::MessageEncryptor.new(ENV['KEY']) 
    crypt.decrypt_and_verify(password) 
    end 
end 
関連する問題