До обновления ловушка не вызывается для модели DataMapper с dm 1.0.2 - PullRequest
0 голосов
/ 28 декабря 2010

У меня следующая модель, и я хочу выполнить метод при сохранении и обновлении, проблема в том, что при обновлении ловушка не выполняется.

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

Я также пытался использовать after: update в дополнение к after: сохранить безуспешно.

Я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 29 декабря 2010

Я думаю, что это ошибка с datamapper, но есть несколько вещей, которые вы можете сделать, чтобы обойти ее, пока они не решат проблему.

Вы можете переопределить метод save в вашем классе User, а затемвызовите тогда необходимый encrypt_password!метод из вашего собственного метода сохранения.Затем просто вызовите метод save родителя, чтобы выполнить сохранение базы данных datamapper db.

Ваш метод сохранения может выглядеть следующим образом

def save
  encrypt_password!
  super
end

Я знаю, что это нарушает подход аспектно-ориентированного проектирования, который использует datamapper с помощью ловушки, но это позволит вам завершить ваш проект сейчас, если вынужно.

0 голосов
/ 10 марта 2012

Я знаю, что уже немного поздно, но я не думаю, что это ошибка.Хуки create и save будут вызываться, только если ресурс действителен.Вы хотите изменить before :save, :encrypt_password! на:

before :valid?, :encrypt_password!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...