Rails 3: пользовательские уведомления модели - PullRequest
1 голос
/ 13 июля 2011

В настоящее время я проверяю, что при попытке создать нового участника и добавить его в команду нет дублированных участников.

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

Я хочу добавить некоторую логику в мой метод add_player в team.rb, который проверяет различные свойства добавляемого игрока.Для этого действия потребуется несколько сообщений об ошибках, кроме «Участник уже существует».Как мне сделать это на уровне модели?

Ответы [ 2 ]

1 голос
/ 13 июля 2011

Вы можете создавать собственные ошибки на моделях 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

Дополнительная информация о пользовательских ошибках проверки ActiveRecord здесь: http://api.rubyonrails.org/v2.3.8/classes/ActiveRecord/Errors.html#M001725

0 голосов
/ 10 августа 2011

Работает логика контроллера для отображения всех ошибок из базы.Однако я не смог добавить ошибки из метода add_player, как предложил Бен.Вместо этого я создал отдельные пользовательские проверки как:

Team.rb

validate validation_name

def validation_name
  if condition
    errors.add_to_base "Error Message"
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...