我正在从一个表单更新两个模型的属性。
User.transaction do
begin
@user.update_attributes!(params[:user])
@board.update_attributes!(params[:board])
rescue ActiveRecord::RecordInvalid
end
end
当@ user.update_attributes产生错误时,事务将停止,并且视图中会显示错误消息。
但是我想尝试更新@user和@board并获取两者的错误消息,以便用户可以一次纠正所有错误。
我该怎么做?
非常感谢你。
答案 0 :(得分:1)
您需要做的就是不使用update_attributes
的爆炸(!)版本。尝试:
User.transaction do
if @user.update_attributes(params[:user]) && @board.update_attributes(params[:board])
...do stuff...
else
render ... (go back to the action the user got here from)
end
end
然后在您的视图代码中使用类似if @user.errors.any?
的条件设置错误块。
update_attribtues
的爆炸版本和大多数activerecord方法意味着如果失败会引发错误,常规版本只返回false并且不保存,所以只要可以使你失败就可以使用它需要根据成功/失败采取行动。只有在失败时才能使用爆炸版本,或者出于某种原因想要显示500个屏幕或其他东西时... ...
答案 1 :(得分:0)
我认为方法名称@user.update_attributes!(params[:user])
中存在一些错误,它应该像@user.update_attributes(params[:user])
一样,或者一旦你需要交叉检查你的参数值是否正确,否则你的代码看起来是正确的。您可以获得有关此update_attributes
答案 2 :(得分:0)
您可以执行以下操作:
User.transaction do
@user.update_attributes(params[:user])
@board.update_attributes(params[:board])
raise ActiveRecord::Rollback unless @user.valid? && @board.valid?
end
这将确保运行两个更新属性方法,以便您可以获取两个对象的错误消息。如果任一对象无效,但不会对数据库进行任何更改。