Rails 3: Модификация логики 'Create' контроллера RESTful - PullRequest
0 голосов
/ 11 июля 2011

Я пытаюсь изменить логику в контроллере RESTful. В текущей реализации у меня есть следующее:

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

has_many :members, :dependent => :destroy

def add_player(player_id)
    current_member = members.find_by_player_id(player_id)
    if current_member
        # will not add duplicate member
    else
        current_member = members.build(:player_id => player_id)
    end
    current_member
end

Этому не хватает некоторых функциональных возможностей, так как я хочу иметь возможность контролировать, сохраняется ли член, проверяя другие атрибуты участника в отношении игрока. В текущей реализации, если я пытаюсь добавить уже существующего участника, он все равно перенаправляется на @team с уведомлением «Участник был успешно добавлен», даже если ни один член не добавляется. Если я попытаюсь удалить избыточность, выполнив следующее, контроллер добавит дублирующиеся элементы.

@team = current_team
@member = @team.add_player(:player_id)

Почему моя текущая логика позволяет мне не сохранять дубликат участника, но все еще отвечает на маршрут @ member.save? Как мне правильно его контролировать?

Ответы [ 2 ]

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

вместо

def add_player(player_id)
current_member = members.find_by_player_id(player_id)
if current_member
    # will not add duplicate member
else
    current_member = members.build(:player_id => player_id)
end
current_member
end

Попробуйте:

Member.rb

validates_uniqueness_of :player_id, :scope => :team_id

team.rb

def add_player(player_id)
    current_member = members.build(:player_id => player_id)   
    current_member
end
0 голосов
/ 11 июля 2011

ntenisOT правильный.Когда вы вызываете build внутри team.rb, вы на самом деле не сохраняете членство, вы просто добавляете игрока в команду с этим конкретным командным объектом.Кроме того, контроллер все еще отвечает на сохранение, потому что вы вызываете функцию сохранения на проигрывателе, который возвращает значение true.

...