更新Rails时显示来自两个模型的错误消息

时间:2011-03-28 04:22:39

标签: ruby-on-rails update-attributes

我正在从一个表单更新两个模型的属性。

User.transaction do
          begin
             @user.update_attributes!(params[:user]) 
             @board.update_attributes!(params[:board])
          rescue ActiveRecord::RecordInvalid
        end
      end

当@ user.update_attributes产生错误时,事务将停止,并且视图中会显示错误消息。

但是我想尝试更新@user和@board并获取两者的错误消息,以便用户可以一次纠正所有错误。

我该怎么做?

非常感谢你。

3 个答案:

答案 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

这将确保运行两个更新属性方法,以便您可以获取两个对象的错误消息。如果任一对象无效,但不会对数据库进行任何更改。

相关问题