Rails 3 run_callbacks方法

jpe*_*thy 14 ruby ruby-on-rails ruby-on-rails-3

我正在使用新的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
Run Code Online (Sandbox Code Playgroud)

我可以通过运行显式调用回调来保存:

> u.run_callbacks(:save)
hi
bye
=> true
Run Code Online (Sandbox Code Playgroud)

我的问题是,我怎么只能运行before_saveafter_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
Run Code Online (Sandbox Code Playgroud)

我不知道如何构建*args回调之前之后调用,我尝试了类似的东西u.run_callbacks(:before_save)(给我未定义的方法错误)并u.run_callbacks(:save, :before)运行所有的保存回调(之前之后).

Bri*_*ian 8

看起来你遇到了Rails 3.0中的一个错误.它似乎在这个灯塔票中提到的3.0.1队列中.

正如@venables所说,你至少可以通过发送false来触发before_save回调run_callbacks(:save).


ven*_*les 6

我还在研究如何只执行after_save,但是要运行JUST the before_save回调,你可以做类似的事情:

u.run_callbacks(:save) { false }
Run Code Online (Sandbox Code Playgroud)

这应该在before_save运行之后取消回调.