gpt4 book ai didi

ruby-on-rails - 多次创建调用 before_save

转载 作者:行者123 更新时间:2023-12-05 05:21:43 25 4
gpt4 key购买 nike

我的模型中有一个 before_save 回调,它在将 2 个字段保存到数据库之前对其进行加密。

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 被调用两次,最终在字段中被加密两次。

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

为什么多次调用before_save?我不喜欢上面链接的帖子的解决方案,我不想先新建/构建再保存。

最佳答案

这是用户错误 :( 在调用 account = Account.create! 之后,我有其他代码调用了 save! 返回模型:account.foo = bar; account.save!。这显然再次调用了 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

关于ruby-on-rails - 多次创建调用 before_save,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42465757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com