1

我正在从一种形式更新两个模型的属性。

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

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

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

我怎样才能做到这一点?

非常感谢您提前。

4

3 回答 3

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?

bang 版本update_attribtues和大多数 activerecord 方法意味着它会在失败时引发错误,常规版本只会返回 false 并且不会保存,所以你可以在失败时使用它,你只需要根据成功/失败。只能在不能失败的情况下使用bang版本,或者当你出于某种原因想要显示500屏幕或其他东西时......

于 2011-03-28T05:08:38.493 回答
0

我认为方法名称中存在一些错误,@user.update_attributes!(params[:user])它应该是这样的,@user.update_attributes(params[:user])或者一旦您需要交叉检查您的参数值是否正确,否则您的代码看起来正确。你可以得到这个update_attributes的帮助

于 2011-03-28T04:33:05.727 回答
0

您可以执行以下操作:

User.transaction do
  @user.update_attributes(params[:user])
  @board.update_attributes(params[:board])
  raise ActiveRecord::Rollback unless @user.valid? && @board.valid?
end

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

于 2011-03-28T05:29:40.983 回答