Представление / Контроллер для уничтожения has_many: через Ассоциацию - PullRequest
1 голос
/ 04 января 2012

У меня есть Пользователи, Команды и TeamMemberships, которые связаны с has_many: through.

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

Мои модели следующие:

# models/team.rb
class Team < ActiveRecord::Base
  has_many :team_memberships, :dependent => :destroy
  has_many :members, :through => :team_memberships
end

# models/user.rb
class User < ActiveRecord::Base
  has_many :team_memberships
  has_many :teams, :through => :team_memberships
end

# models/team_membership.rb
class TeamMembership < ActiveRecord::Base
  belongs_to :team
  belongs_to :member, class_name: 'User', foreign_key: 'user_id'
end

Вид в настоящее время выглядит следующим образом:

- @team.members.each do |member|
  .member
    = link_to member.name, user_path(member)
    = button_to "Remove User"

Я ищу помощь в завершении реализации кнопки «Удалить пользователя». Я не уверен, как передать в TeamMembership, что мне нужно уничтожить.

1 Ответ

3 голосов
/ 04 января 2012
resources :teams do
    resources :users do
        member do
            delete :remove_from_team
        end
    end
end

В пользовательском контроллере:

def remove_from_team
    @team = Team.find(params[:team_id]) #can do that in before_filter
    user = User.find(params[:id])
    @team.members.delete user
    redirect_to @team
end

В представлении

= button_to "Remove user", remove_from_team_team_user_path(@team, member), :method => :delete

Вы могли бы просто иметь

resources :team_memberships

И иметь действие уничтожения в контроллере team_memberships

= button_to "Remove user", team_membership_path(@team.team_memberships.where(:user_id => member.id).first), :method => :delete

Но для получения team_membership для каждого участника потребуется запрос, даже если пользователь никогда не нажимает на ссылку ...

...