Метод Rails 3 run_callbacks

Я играю с новым Rails 3 API, и у меня есть вопрос относительно нового метода run_callbacks (kind, * args, & block)

В следующем коде:

class User < ActiveRecord::Base
  before_save :say_hi
  after_save :say_bye

  private

    def say_hi; puts "hi"; end

    def say_bye; puts "bye"; end

end

Я могу явным образом вызвать обратные вызовы при сохранении путем запуска:

> u.run_callbacks(:save)
hi
bye
=> true

Но мой вопрос, как я могу только запускать обратный вызов before_save или after_save?

Просмотр кода run_callbacks(kind, *args, &block):

# File activesupport/lib/active_support/callbacks.rb, line 92
def run_callbacks(kind, *args, &block)
  send("_run_#{kind}_callbacks", *args, &block)
end

Я не знаю, как построить *args только для вызова до или после обратных вызовов, я пробовал что-то вроде u.run_callbacks(:before_save) (дает мне ошибку метода undefined) и u.run_callbacks(:save, :before) запускает все обратные вызовы сохранения (до и после после того, как).

Ответы

Ответ 1

Похоже, вы столкнулись с ошибкой в ​​Rails 3.0. Кажется, он находится в очереди на 3.0.1, как указано в этот маяк.

Как сообщает @venables, вы можете, по крайней мере, запустить обратные вызовы before_save, отправив false в run_callbacks(:save).

Ответ 2

Я все еще смотрю, как делать только after_save, но для запуска JUST обратного вызова before_save вы можете сделать что-то вроде:

u.run_callbacks(:save) { false }

Это должно отменить обратные вызовы после запуска before_save.