Rails after_create callback не может получить доступ к атрибутам модели - PullRequest
5 голосов
/ 07 апреля 2010

Я не могу получить доступ к атрибутам моей модели в обратном вызове after_create ... похоже, я должен уметь правильно?

Контроллер:

@dog = Dog.new(:color => 'brown', :gender => 'male')
@dog.user_id = current_user.id
@dog.save

Модель:

class Dog < ActiveRecord::Base
  def after_create
    logger.debug "[DOG CREATED] color:#{color} gender:#{gender} user:#{user_id}"
  end
end

консоль: (все вроде хорошо)

>>Dog.last
=>#<Dog id: 1, color: "brown", gender: "male", user_id: 1>

log: (wtf!?)

...
[DOG CREATED] color: gender:male user
...

Некоторые из моих атрибутов появляются, а другие нет! о нет! Кто-нибудь знает, что я делаю не так? В прошлом я всегда мог использовать after_create такими способами.

Примечание. Фактические имена и значения переменных, которые я использовал, были разными, но методы и код были одинаковыми.

Ответы [ 4 ]

4 голосов
/ 09 апреля 2010

Разобрался со своей собственной проблемой.

Один из атрибутов был виртуальным, в котором я использовал self.update_attribute ... упс!

def price=(amt)
  self.update_attribute(:price_in_cents, (amt*100.0).to_i)
end

Итак, для записи,update_attribute фактически создаст запись базы данных (и сработает after_create), если она еще не была создана.

В следующий раз я обязательно выложу полный код!

0 голосов
/ 08 апреля 2010

Попробуйте использовать after_save вместо after_create, возможно, это работает. не проверено, хотя.

after_create () Вызывается после Base.save для новых объектов, которые еще не были сохранены (запись не существует). Обратите внимание, что этот обратный вызов все еще включен в транзакцию вокруг сохранения. Например, если в этот момент вы вызовете внешний индексатор, он не увидит изменений в базе данных.

0 голосов
/ 08 апреля 2010

Обратный вызов в стиле макросов, вероятно, является лучшей идеей, чем просто переопределение метода.Это позволяет вам запускать несколько разных методов одновременно в жизненном цикле (если хотите).Я думаю, что вам нужно это:

class Dog < ActiveRecord::Base
  after_create :dog_logger

  def dog_logger
        logger.debug "[DOG CREATED] color:#{self.color} gender:#{self.gender} user:#{self.user_id}"
  end
end
0 голосов
/ 07 апреля 2010

Попробуйте вместо этого:

class Dog < ActiveRecord::Base
  def after_create(dog)
    logger.debug "[DOG CREATED] color:#{dog.color} gender:#{dog.gender} user:#{dog.user_id}"
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...