我有以下模型,我想在保存和更新时执行一个方法,问题是钩子没有在更新时执行。
class User
include DataMapper::Resource
include BCrypt
property :id, Serial
property :email, String, :index => true
property :crypted_password, String, :accessor => :private
...
attr_accessor :password, :password_confirmation
before :save, :encrypt_password!
# also tried the following with no success:
# before :update, :encrypt_password!
# and tried this but hell was never raised
# before :update do
# raise 'hell'
# end
def encrypt_password!
self.crypted_password = Password.create password
end
end
此规范失败:
it 'should call encrypt_password! on update' do
subject.save.should be_true
subject.should_receive(:encrypt_password!)
subject.update(:password => 'other-password', :password_confirmation => 'other-password').should be_true
end
这传递了:
it 'should call encrypt_password! on create' do
subject.should_receive(:encrypt_password!)
subject.save.should be_true
end
我也尝试过以后:更新除了之后:保存但没有成功。
我错过了什么吗?
答案 0 :(得分:2)
我认为这是datamapper的一个错误,但是在解决问题之前,你可以采取一些措施来解决问题。
您可以覆盖User类中的save方法,然后调用必要的encrypt_password!自定义保存方法中的方法。然后只需调用父级的save方法来执行datamapper db save。
您的保存方法可能如下所示
def save
encrypt_password!
super
end
我知道这违反了datamapper使用hook的面向方面的设计方法,但如果需要,这将允许您现在完成项目。
答案 1 :(得分:0)
我知道这有点晚了,但我不认为这是一个错误。仅当资源有效时,才会调用创建和保存挂钩。您想将before :save, :encrypt_password!
更改为:
before :valid?, :encrypt_password!