当我使用IRB创建一个新的模型实例并保存时,没有什么打印到控制台,我得到一个“ActiveRecord :: StatementInvalid:MysqL :: Error:Column’user_id’不能为空”的错误,所以我假设before_save不是被叫我不知道为什么.我甚至尝试使用before_save过滤器.这是我的代码:
require 'secure_resource/secure_resource_encryption' class Database < ActiveRecord::Base belongs_to :username_encryption,:class_name => "Encryption",:foreign_key => :username_encryption_id belongs_to :password_encryption,:foreign_key => :password_encryption_id # Virtual attribute to retrieve the decrypted username. def username if self.username_encryption.nil? return nil end begin return self.username_encryption.encryption rescue SecureResourceError raise SecureResourceError end end # Provides a way to reset the username. def username=(username) if self.username_encryption.nil? self.username_encryption = Encryption.new self.username_encryption.encryption = username end end # Virtual attribute to retrieve the decrypted password. def password if password_encryption.nil? return nil end begin return password_encryption.encryption rescue SecureResourceError raise SecureResourceError end end # Provides a way to reset the password. def password=(password) if self.password_encryption.nil? self.password_encryption = Encryption.new self.password_encryption.encryption = password end end def before_save p 'ZZZZZZZZZZZZZZZ' p self.user_id.to_s + ' ZZZZZZ' p 'ZZZZZZZZZZZZZZZ' self.username_encryption.user_id = self.user_id self.username_encryption.save self.username_encryption_id = self.username_encryption.id self.password_encryption.user_id = self.user_id self.password_encryption.save self.password_encryption_id = self.password_encryption.id end end
解决方法
正如你可以看到
in the documtation,before_save在验证之后发生.在你的情况下,验证将失败,并且永远不会调用before_save.
由于回调的目标是在验证发生之前将对象设置为有效状态,请尝试before_validation回调.