Направляющие after_create обратный вызов не могут получить доступ к атрибутам модели

Я не могу получить доступ к атрибутам своей модели в 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>

журнал: (wtf!?)

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

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

Примечание: Фактические имена переменной и значения, которые я использовал, отличались, но методы и код являются тем же.

5
задан tybro0103 7 April 2010 в 16:20
поделиться

4 ответа

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

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

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

Поэтому для записи update_attribute фактически создаст запись базы данных (и вызовет триггер after_create), если она еще не была создана.

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

4
ответ дан 15 December 2019 в 00:55
поделиться

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

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
ответ дан 15 December 2019 в 00:55
поделиться

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

class Dog < ActiveRecord::Base
  def after_create(dog)
    logger.debug "[DOG CREATED] color:#{dog.color} gender:#{dog.gender} user:#{dog.user_id}"
  end
end
0
ответ дан 15 December 2019 в 00:55
поделиться

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

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

0
ответ дан 15 December 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: