2013-11-28 2 views
0

Я пытаюсь добавить дэ возможность легко добавлять и удалять игроков «» из «группы»Как удалить объект из модели коллекции с помощью ссылки

Group является модель, которая has_and belongs_to_many игроков. Это буквально просто имя с группой игроков на нем и user_id, чтобы определить, чья это группа.

Есть следующий контроллер групп

def remove_player(player) 
@group = current_user.groups.find params[:id] 
@group.players.delete(player) 
redirect_to @group 
end  

Есть следующий по мнению

- @group.players.each do |player| 
     %tr 
     %td 
      = player.name 
     %td 
      = link_to 'Delete', remove_player_group_path(player.id), :class => 'btn btn-mini btn-danger' 

И есть следующий в маршрутах

resources :groups do 
member do 
    post 'add_player' 
    post 'remove_player' 
end 

Но я получаю ноль маршрутизации ID ошибка. Уверен, это должно быть очень просто, любые идеи. Просто хочу иметь возможность удалять игрока из группы.

также экспериментировал с:

= link_to 'Delete', :controller => "group", :action => "remove_player", :class => 'btn btn-mini btn-danger' 

Который дает мне ошибку маршрутизации ...

ответ

0

Во-первых, похоже, у вас есть ошибка синтаксиса.

Это:

current_user.groups.find params[:id] 

Должно быть:

current_user.groups.find(params[:id]) 

Во-вторых, не должно быть путь:

group_remove_player_path(player.id) 
+0

Путь кажется прекрасным. Если я изменю его, я получаю ошибку метода. Rails кажется достаточно счастливым с синтаксисом, я использую то же самое на add-player и, похоже, работает. Ошибка Нет совпадений маршрутов {: action => "remove_player",: controller => "groups",: id => nil} – Carpela

+0

Я бы посоветовал использовать жучок для отладки (https://github.com/pry/pry) и добавьте 'binding.pry' в начале действия 'remove_player', чтобы проверить, что значение 'player' и 'paramsp: id]' на самом деле правильное/не null. Приложение остановится при привязке.и вы сможете проверить значения ваших переменных в консоли, на которой запущен сервер rails. – JellyFishBoy

0

Я бы рекомендовал не использовать has_and_belongs_to_many, и вместо того, чтобы с помощью полномасштабная модель таблицы соединений. например

class Group 
    has_many :group_players 
    has_many :players, :through => :group_players 

class GroupPlayer 
    belongs_to :group 
    belongs_to :player 

class Player 
    has_many :group_players 
    has_many :groups, :through => :group_players 

Теперь, если вы хотите удалить игрока из группы, вы удаляете соответствующую запись group_player. Это также может отслеживать, когда игроки присоединились к группе, если вы дадите player_groups стандартное поле timestamp.

Сказав все это, ваша проблема может быть просто, что вы говорите

link_to 'Delete', :controller => "group", :action => "remove_player", :class => 'btn btn-mini btn-danger' 

и это должно быть

link_to 'Delete', :controller => "groups", :action => "remove_player", :class => 'btn btn-mini btn-danger' 

То есть если у вас есть groups_controller.rb, не group_controller.rb. Но в любом случае лучше использовать именованные маршруты, как предлагает @JellyFishBoy.

Смежные вопросы