Вы можете абсолютно использовать общий метод для некоторых работ вашего наблюдателя. Но есть пара проблем с другим ответом. Во-первых, параметр не может быть глобальным (например, def assign_meta(@logitem)
). Во-вторых, вызов save фактически возвращает true или false, а не объект.
Наконец, есть разница между after_save
и after_create
, поэтому они оба существуют. after_create
позволяет выполнять определенные действия только в том случае, если запись является новой - например, создание зависимостей.
У меня проблема с @logitem
- что это? Кроме того, если вы наблюдаете модель книги, то почему это называется наблюдателем регистратора книг? Поскольку ваш пример является вымышленным, я постараюсь создать пример, который работает и будет более понятным. Я предполагаю, что "logitem" - это другая модель, которую вы настроили для отслеживания событий сайта:
class BookObserver < ActiveRecord::Observer
def after_create(book)
@log_item = LogItem.new :action => "created book"
assign_meta(@log_item, book)
@log_item.save!
end
def after_save(book)
@log_item = LogItem.new :action => "saved book"
assign_meta(@log_item, book)
@log_item.save!
end
protected
def assign_meta(log_item, book)
log_item.item_name = book.name
end
end
В этом примере создается новый log_item. Дается описание действия, затем в методе assign_meta
задаются общие данные (в данном случае, item_name). Он защищен, потому что доступ к нему должен осуществляться только из других методов экземпляра (after_create, after_save и т. Д.). И наблюдатель переименован, чтобы быть более интуитивным.
Надеюсь, это поможет!