1

1つのフォームから2つのモデルの属性を更新しています。

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

あなたがする必要があるのは、のbang(!)バージョンを使用しないことです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を返し、保存しないため、失敗しても問題がない場合は、成功に基づいてアクションを実行する必要があります。失敗。失敗しても問題がない場合、または何らかの理由で500画面などを表示したい場合にのみ、bangバージョンを使用してください...

于 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

これにより、両方のupdate属性メソッドが確実に実行され、両方のオブジェクトのエラーメッセージを受け取ることができます。いずれかのオブジェクトが無効であるが、データベースに変更が保持されない場合。

于 2011-03-28T05:29:40.983 に答える