如何通过链接从集合模型中删除对象

时间:2013-11-28 11:29:16

标签: ruby-on-rails

我正在尝试添加轻松添加和删除“群组”中“玩家”的能力

群组是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

但是我得到一个nil id路由错误。 我相信这应该是非常简单的,任何想法。只是希望能够从一个组中删除一个玩家。

还尝试了:

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

这给了我一个路由错误......

2 个答案:

答案 0 :(得分:0)

首先,它看起来有语法错误。

此:

current_user.groups.find params[:id]

应该是:

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

其次,路径不应该是:

group_remove_player_path(player.id)

答案 1 :(得分: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提供标准时间戳字段,这还可以跟踪玩家加入群组的时间。

说了这么多,你的问题可能只是你说的

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建议的那样。

相关问题