rails before_save回调不会触发

时间:2014-03-19 15:33:57

标签: ruby-on-rails

在我的rails应用程序中,我想检查通过表单发送的金额,然后再将其保存到数据库中。如果金额太大,我想设置一个布尔变量"确认"为假。否则,它的确认和真实。

我在我的模型中输入了这个:

  # 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

测试此结果如下: - 如果金额<&lt; 9999,表格得到保存,一切都很好。 - 如果金额> 9999,表格没有保存。它只是停留在同一页面上,没有任何反应。除了未将数据输入数据库这一事实外,没有任何错误消息,也没有在日志中看到任何内容。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

这是因为如果amount大于9999,则从块返回的值为false(来自self.confirmed = false行) - 如果块(或方法)传入{{1} } return before_save,ActiveRecord停止保存记录。因此,简单的解决方案是添加将返回的false

true

相关文件供参考:

  

如果before_ *回调返回false,则取消所有后续回调和相关操作。如果after_ *回调返回false,则取消所有后续回调。回调通常按照定义的顺序运行,但定义为模型上的方法的回调除外,这些回调最后被调用。

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