如何处理视图中 HABTM 关联的 Delete link?

How to handle Delete link for HABTM association in views?

我遇到了一个简单的问题,但已经苦苦挣扎了好几个小时。我的 rails 应用程序中有这两个模型:

class User < ActiveRecord::Base
  has_and_belongs_to_many :groups
 end

class Group < ActiveRecord::Base
  has_and_belongs_to_many :users
end

和这个控制器:

class GroupsController < ApplicationController
def show
  @group = Group.find(params[:id])
  @users = @group.users
end

我需要显示一个视图,显示一个特定组及其相关用户,每个用户旁边是一个 link,用于在点击删除按钮时将用户从关联中删除。我当前的 views/groups/show 版本如下所示:

<p>Description: <%= @group.description if @group.description %></p>
  <p>Associated Users:
   <ul> 
    <% @users.each do |user| %>
     <li>
       <%= link_to user.email %>
       <%= link_to user.name %>
      <button>
       <%= link_to("Remove user from group", @group.users.delete(user),
       :data => { :confirm => "Are you sure?" }) unless user == current_user %>
      </button>
     </li>
    <% end%>  
   </ul>
  </p>

"works" 但是当我刷新页面时,执行了删除方法,并且没有点击按钮就删除了关联。我尝试使用部分方法和许多其他不同的方法,但无法弄清楚。你能帮忙吗?

在呈现页面时,您正在执行 @group.users.delete(user) 因此当页面显示时它们当然会被删除。刷新时不会发生...刷新时您只会看到上次渲染的结果。

您需要在 routes.rb 中定义一条路线,当您跟随 link_to 时将调用一个动作,然后 link_to 应指向该路线路径。

也许你的路线中有这样的东西......

resources :groups do
  member do 
    get 'detach'
  end
end

然后你的 link 看起来像...

   <%= link_to("Remove user from group", detach_group_path(@group, user_id: user.id),
   :data => { :confirm => "Are you sure?" }) unless user == current_user %>

最后,您可以在群组控制器中执行分离操作...

def detach
  group = Group.find(params[:id])
  user = User.find(params[:user_id])
  group.users.delete(user)
  redirect_to group_path(group)
end