在没有使用dm 1.0.2调用DataMapper模型的更新挂钩之前

时间:2010-12-27 23:47:34

标签: ruby-on-rails ruby datamapper

我有以下模型,我想在保存和更新时执行一个方法,问题是钩子没有在更新时执行。

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

我也尝试过以后:更新除了之后:保存但没有成功。

我错过了什么吗?

2 个答案:

答案 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!