2014-03-19 39 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