rails 回调函数

回呼 Callback

在介紹過驗證之後,接下來讓我們來看看回呼。回呼可以在Model資料的生命週期,掛載事件上去,例如我們可以在資料儲存進資料庫前,做一些修正,或是再儲存成功之後,做一些其他動作。回呼大致可以分成三類:

  1. Validation驗證前後 2. 在儲存進資料庫前後 3. 在從資料庫移除前後

以下是當一個物件儲存時的流程,其中1~7就是回呼可以觸發的時機:

  • (-) save
  • (-) valid
  • (1) before_validation
  • (-) validate
  • (2) after_validation
  • (3) before_save
  • (4) before_create
  • (-) create
  • (5) after_create
  • (6) after_save
  • (7) after_commit

來看一個範例:設定一個before_validation回呼設定預設值,其中的setup_default方法會在資料驗證前執行:

class Event < ActiveRecord::Base

    before_validation :setup_default

    protected

    def setup_default
        self.is_public ||= true
    end
end
  1. 回呼的方法最好放在protectedprivate下,確保從Model外部是無法呼叫的。
  2. before_validationbefore_save的差別在於後者不會經過Validation資料驗證。
  3. 請避免before_開頭的回呼方法中,最後運算的結果不小心回傳false。這樣會中斷儲存程序。如果不確定的話,請回傳return true。這算是常見的地雷,而且不容易除錯(你會發現資料莫名地無法儲存成功)。

其中after_rollbackafter_commit這兩個回呼和Transaction交易有關。Rollback指的是在transaction區塊中發生例外時,Rails會將原先transaction中已經被執行的所有資料操作回復到執行transaction前的狀態,after_rollback就是讓你在rollback完成時所觸發的回呼,而after_commit是指在transaction完成後才觸發的回呼,關於transaction的部份請參考ActiveRecord 進階功能交易Transactions一節。


转自:http://ihower.tw/rails3/activerecord-lifecycle.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值