Я не могу получить доступ к атрибутам своей модели в 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 такими способами в прошлом.
Примечание: Фактические имена переменной и значения, которые я использовал, отличались, но методы и код являются тем же.
Разобрался с собственной проблемой.
Один из атрибутов был виртуальным, в котором я использовал self.update_attribute...oops!
def price=(amt)
self.update_attribute(:price_in_cents, (amt*100.0).to_i)
end
Поэтому для записи update_attribute фактически создаст запись базы данных (и вызовет триггер after_create), если она еще не была создана.
В следующий раз я обязательно выложу полный код!
Обратный вызов в стиле макроса, вероятно, является лучшей идеей в целом, чем простое переопределение метода. Он позволяет запускать несколько разных методов одновременно в жизненном цикле (если хотите). Я думаю, что вам нужно следующее:
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
Попробуйте вместо этого:
class Dog < ActiveRecord::Base
def after_create(dog)
logger.debug "[DOG CREATED] color:#{dog.color} gender:#{dog.gender} user:#{dog.user_id}"
end
end
Попробуйте использовать after_save вместо after_create, возможно, это сработает. хотя не проверял.
after_create () Вызывается после Base.save для новых объектов, которые еще не были сохранены (запись не существует). Обратите внимание, что этот обратный вызов по-прежнему заключен в транзакцию сохранения. Например, если на этом этапе вы вызовете внешний индексатор, он не увидит изменений в базе данных.