2011-09-13 2 views
1

ない限り保存されません。私はここでは、2つのオブジェクトのユーザー会どのように二つのオブジェクトのためのエラーを表示するようにし、両方が有効

するためのフォームを持っていることは、私のコントローラである:

def create 
    @board = Board.new(params[:board]) 
    @user = User.new(params[:user]) 
     respond_to do |format| 
     if (@user.save and @board.save) 
      format.js {redirect_to some_path} 
     else 
      format.js {render :action => "new" } 
     end 
     end 
    end 

私はしたくありません両方が有効でない場合は、どちらかを保存してください。そして私は両方のエラーメッセージを一度にフォームに表示したい。

私は '& &' '&' 'と'の組み合わせはすべて試しましたが、私の望む結果は得られません。一方のオブジェクトのエラーを表示し、他方のオブジェクトを保存します。

これを正しく行うにはどうすればよいですか?

答えて

3

&&は、Linuxで&&のように動作しません。

あなたには2つの選択肢があります。レコードがvalid?かどうかを確認してから、保存を実行できます。

def create 
    @board = Board.new(params[:board]) 
    @user = User.new(params[:user]) 
    respond_to do |format| 
    if @user.valid? && @board.valid? 
     @user.save! 
     @board.save! 
     format.js { redirect_to some_path } 
    else 
     # do something with #errors. 
     # You check the existence of errors with 
     # @user.errors.any? 
     # @board.errors.any? 
     # and you access the errors with 
     # @user.errors 
     # @board.errors 
     format.js { render :action => "new" } 
    end 
    end 
end 

またはデータベースがトランザクションをサポートしている場合は、トランザクションを使用します。

def create 
    @board = Board.new(params[:board]) 
    @user = User.new(params[:user]) 
    respond_to do |format| 
    begin 
     transaction { @user.save! && @board.save! } 
     format.js { redirect_to some_path } 
    rescue ActiveRecord::RecordInvalid 
     format.js { redirect_to some_path } 
    end 
    end 
end 

個人的には、私はvalid?をチェックします。

+0

ありがとうSimone私はそれを試してみましょう。あなたの非常に明確な答えをありがとう。本当にNOOBを助ける – chell

0

あなたはあなたが見るのActiveRecordの保存方法のソースコードを見ると:

def save(options={}) 
    perform_validations(options) ? super : false 
end 

あなたが何をしたいのか、保存呼び出す前に、手動でperform_validationsを実行しています。このために、有効な?メソッドをActiveResourceから取得します。あなたはここにドキュメントを見つけることができます。

http://api.rubyonrails.org/classes/ActiveRecord/Validations.html#method-i-valid-3F

関連する問題