在我的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,表格没有保存。它只是停留在同一页面上,没有任何反应。除了未将数据输入数据库这一事实外,没有任何错误消息,也没有在日志中看到任何内容。
我做错了什么?
答案 0 :(得分:3)
这是因为如果amount
大于9999,则从块返回的值为false
(来自self.confirmed = false
行) - 如果块(或方法)传入{{1} } return before_save
,ActiveRecord停止保存记录。因此,简单的解决方案是添加将返回的false
:
true
相关文件供参考:
如果before_ *回调返回false,则取消所有后续回调和相关操作。如果after_ *回调返回false,则取消所有后续回调。回调通常按照定义的顺序运行,但定义为模型上的方法的回调除外,这些回调最后被调用。