Rails - Понимание того, как создавать методы? - PullRequest
0 голосов
/ 28 октября 2010

Я создаю модель наблюдателя: booklogger_observer.rb

Модель наблюдателя выглядит примерно так:

class BookLoggerObserver < ActiveRecord::Observer
  observe :book

  def after_create(record)
     @logitem = ......app specific stuff
     @logitem = ......
     @logitem = ......
     assign_meta(@logitem)
     @logitem.save!
  end

  def after_save(record)
     @logitem = ......
     @logitem = ......
     @logitem = ......
     assign_meta(@logitem)
     @logitem.save!
  end

  def assign_meta(@logitem)
     @logitem = ......
     @logitem = ......
     @logitem = ......
  end

end

Где я застрял, я хочу использовать DEFassign_meta для выполнения действий, которые являются общими для after_create и after_save, но я не знаю, как передать @logitem в DEF и затем отправить его обратно для сохранения.

Можете ли вы помочь мне понять этот поток?

Спасибо

Ответы [ 2 ]

1 голос
/ 28 октября 2010

Вы можете абсолютно использовать общий метод для некоторых работ вашего наблюдателя. Но есть пара проблем с другим ответом. Во-первых, параметр не может быть глобальным (например, 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 и т. Д.). И наблюдатель переименован, чтобы быть более интуитивным.

Надеюсь, это поможет!

0 голосов
/ 28 октября 2010

в ruby ​​последняя строка - это то, что выводится, поэтому ваши after_save и after_create будут содержать @logitem, поэтому нет необходимости передавать его обратно в def.

Вам также не нужно after_create потому что для создания требуется сохранение, поэтому оно просто избыточно.

Вы также можете просто сохранить переменную в assign_meta, если вам не нужно ничего делать с ней, но вы можете сохранить ее в исходных определенияхтоже.

используйте это, если у вас нет бизнеса после назначения метаинформации

def assign_meta(logitem)
    logitem = .....
    logitem.save(false)
 end

используйте это, если вам нужно сделать больше работы в исходном определении.

def assign_meta(@logitem)
    @logitem = .....
    @logitem.save(false)
 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...