我们在out_logs控制器中有以下代码,用于保存在rails 3.1.3 app中的两个表中。为了确保两个节省完成或没有完成,使用了一个事务。
@out_log.transaction do
if @out_log.save && @part.save
redirect_to part_path(@part), :notice => "Saved!"
else
flash.now[:error] = "Not saved!"
render 'new'
end
end
代码似乎有效。我们的问题是:
非常感谢。
答案 0 :(得分:3)
首先关闭:redirect_to
或render
不像return
声明。他们只是在当前正在准备的响应中分配一些标题。
关于交易:
if @out_log.save && @part.save
上面的代码肯定会导致数据库中的状态不一致:如果第一个save
成功而第二个不成功怎么办?甚至很难想象。
解决方案非常简单:使用save!
(最后带有感叹号)。这样,如果验证失败,您的整个事务将被回滚(save!
将引发异常,而不是像false
那样返回save
。