2014-03-19 52 views
0

在我的Rails應用程序中,我想檢查通過表單發送的數額,然後將其保存到數據庫。如果金額太大,我想設置一個布爾變量「確認」爲false。否則,它的確認和真實。如果量< 9999,形式 - :rails before_save回調不會觸發

# if amount is too big, set to unconfirmed 
    before_save do 
    if self.amount > 9999 
     self.confirmed = false 
    else 
     self.confirmed = true 
    end 
    end 

控制器動作(是腳手架):

def create 
    @statement = Statement.new(statement_params) 

    respond_to do |format| 
     if @statement.save 
     format.html { redirect_to thankyou_path, notice: 'Successfully created.' } 
     format.json { render action: 'show', status: :created, location: @statement } 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @statement.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

測試這導致以下

我在我的模型中輸入這個得到保存,一切都很好。 - 如果金額> 9999,表單不會被保存。它只是停留在同一頁面上,沒有任何反應。沒有錯誤信息,除了數據沒有輸入數據庫之外,沒有什麼可以在日誌中看到。

我該怎麼做?

+0

請分享你在哪裏試圖保存數據的控制器代碼。更新問題本身。 –

+0

編輯。這是一個經典的腳手架邏輯。 – DonMB

回答

3

這是因爲如果amount大於9999,從塊返回的值是false(從self.confirmed = false線) - 如果塊(或方法)傳遞到before_save回報false,ActiveRecord的停止保存記錄。所以簡單的解決方案是增加true將返回:

before_save do 
    if self.amount > 9999 
    self.confirmed = false 
    else 
    self.confirmed = true 
    end 
    true 
end 

參考相關的一條文檔編制的:

如果before_ *回調返回false,所有後來的回調和相關行動被取消。如果after_ *回調返回false,則後面的所有回調都將被取消。回調通常按照它們定義的順序運行,除了在模型上定義爲方法的回調之外,這些回調被稱爲最後一個回調。

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#module-ActiveRecord::Callbacks-label-Canceling+callbacks

+0

釘牢它。謝謝! – DonMB