2011-07-12 20 views
1

現在、新しいメンバーを作成してチームに追加しようとすると、重複するメンバーがないことを確認しています。Rails 3:カスタムモデル通知

members_controller.rb

def create 
    @team = current_team 
    player = Player.find(params[:player_id]) 
    @member = @team.add_player(player.id) 

    respond_to do |format| 
    if @member.save 
     format.html { redirect_to(@team, :notice => 'Member was successfully added.') } 
     format.js { @current_member = @member } 
     format.xml { render :xml => @member, 
     :status => :created, :location => @member } 
    else 
     format.html { redirect_to(@team, :notice => 'Member already exists.') } 
     format.xml { render :xml => @member.errors, 
     :status => :unprocessable_entity } 
    end 
    end 
end 

team.rb

def add_player(player_id) 
    current_member = members.build(:player_id => player_id) 
    current_member 
end 

私が追加されているプレーヤーのさまざまなプロパティをチェックしteam.rbの私add_player方法にいくつかのロジックを追加します。このアクションは、 'Member already exists'以外の複数の失敗メッセージを必要とします。モデルレイヤーでこれを行うにはどうすればよいですか?

答えて

0

をコントローラロジックがすべて表示しますベースからのエラーが処理されました。しかし、Benが提案したようにadd_playerメソッドからエラーを追加することはできませんでした。代わりに別のカスタム検証を作成しました。

Team.rb 

validate validation_name 

def validation_name 
    if condition 
    errors.add_to_base "Error Message" 
    end 
end 
1

ActiveRecordモデルでカスタムエラーを作成できます。保存が成功しなかった場合、これらのカスタムエラーは、あなたのコントローラ内で照会することができ、自分のメッセージを、持つことができます。ここでは、カスタムActiveRecordの検証エラーの

# app/models/team.rb 
def add_player(player_id) 
    current_member = members.build(:player_id => player_id) 
    errors.add(:player_id, 'Custom error message here') if condition 
    errors.add(:base, 'Custom error message here') if condition  
    current_member 
end 

# app/controllers/members_controller.rb 
def create 
    @team = current_team 
    player = Player.find(params[:player_id]) 
    @member = @team.add_player(player.id) 

    respond_to do |format| 
    if @member.save 
     format.html { redirect_to(@team, :notice => 'Member was successfully added.') } 
     format.js { @current_member = @member } 
     format.xml { render :xml => @member, 
     :status => :created, :location => @member } 
    else 
     format.html { redirect_to(@team, :notice => @member.errors.full_messages) } 
     format.xml { render :xml => @member.errors, 
     :status => :unprocessable_entity } 
    end 
    end 
end 

詳細情報:http://api.rubyonrails.org/v2.3.8/classes/ActiveRecord/Errors.html#M001725

+0

これを実装する方法はわかりません。私がチェックしたいすべての属性がメンバーにあります。チーム内に条件を把握するメソッドがあるため、チーム内で条件をチェックしたいメソッドがあります。私はベースを使用しようとしましたが、次のようなものを試したときに状態がトリップしたようには思えませんでした: errors.add(:base、 'Custom error message here')if method_returns_one> 2 –

+0

メンバーモデルあなたがチェックしているものが、チームの文脈でのみ有効であるか無効であるかを除きます。メンバーオブジェクトが有効でない場合、メンバーはチームを介して構築されているため、チームオブジェクトはどちらも対象になりません。 –

+0

また、チームのカスタムエラーを表示するには、saveを呼び出す前にadd_playerメソッドを少なくとも1回呼び出して計算を行う必要があります。これらのエラーチェックを "validate"という名前のメソッドに移す方が良いかもしれません。レコードが有効かどうかをチェックするとき、Railsは自動的にこの名前のメソッドを探します –