Rails 关于 callback 的单独句柄类

douya0808 · 2012年04月11日 · 最后由 douya0808 回复于 2012年04月11日 · 2941 次阅读

我查了很久都没查到 ror 中回调函数所谓的"句柄"是什么意思=。=

如果有一组想用来共享的回调函数,可以将其写成单独句柄类

class CreditCardCallbacks
   def before_validation(model)
        model.cc_number.gsub!(/[-\s]/,'')  #cc_number代表信用卡号码
   end
end


然后在两个模型类中共享回调函数,Order 模型和 Subscription 都有 cc_number 属性

class Order<ActiveRecord::Base
  before_validation CreditCardCallbacks.new  #怎么不是Order.new
end

class Subscription<ActiveRecord::Base
  before_validation CreditCardCallbacks.new #怎么不是Subscription.new
end


上面两个 model 调用回调函数,为什么传的是回调函数的实例(CreditCardCallbacks.new)而不是模型本身的实例(Order.new)进去呢 求前辈点醒-.-

那两个 model 的里的 before_validation 并不是在调用回调函数,而是在注册回调函数。

就好像把 CreditCardCallbacks 类里的 before_validation 函数分别拿到了 Order 类和 Subscription 类里来用吗?但是传的时候也得传 Order.new 和 Subscription.new 才对呀 不然其中的 model.cc_number.gsub,就不发确定操作的是哪个 model 里的 cc_number 了呀:)

@skandhas 您是说那两个 model 里的 before_validation 不是在调用 CreditCardCallbacks 里的 before_validation 而是在定义自己的 before_validation 吗?:)嘿嘿

#3 楼 @douya0808 你的理解比较接近了。再去看看 Rails 文档或是相关书籍巩固一下。:) 所谓回调就是先存后用。

@skandhas 俺也是沈阳的 在格微软件实习的小学生 看到您也是沈阳的倍感亲切啊 呜哈哈哈

#6 楼 @douya0808 呵呵,你也在沈阳啊。有机会咱们沈阳的 ruby 爱好者也聚聚 :)

class User < ActiveRecord::Base
  def after_initialize
    puts "You have initialized an object!"
  end

  def after_find
    puts "You have found an object!"
  end
end

>> User.new
You have initialized an object!
=> #<User id: nil>

>> User.first
You have found an object!
You have initialized an object!
=> #<User id: 1>


我对以上的文档执行结果有疑问,请前辈指教 把 after_initialize 和 after_find 声明为普通方法而非注册方式,不就是怕他们两个总在数据库操作的时候总自动执行影响效率么,注册方式都是自动执行的,但是 after_initialize 和 after_find 不是注册方式的方法,而是普通方式的,但是我没看到有调用它们俩的动作呀 为什么他俩也自动执行了呢:) 不知道我有没有说明白

#8 楼 @douya0808 ActiveRecord::Base 搞的小动作

@doitian 你好 我想请教下 就算 after_initialize 和 after_find 是自动执行那也是执行了啊 但是为了效率不是不想让他们执行吗?那干脆不写不就行了吗?我就没转过来这个弯=.=

#8 楼 @douya0808 after_initialize 和 after_find 在 Rails 3.1 及以前 是普通方法版本。Rails3.2 后已经是注册方式了。

@skandhas 更新的太快了 那我直接不写注册他俩就不会被执行也有没有所谓的效率问题了吧:)

需要 登录 后方可回复, 如果你还没有账号请 注册新账号