如何在循环中删除关联模型EventUser而非User对象?
解决多对多关联中删除用户与活动关联而非用户本身的问题
嗨,我来帮你搞定这个问题~你现在遇到的核心问题是:当前的link_to指向的是User对象的销毁路由,所以点击后会直接删除整个用户记录,而我们真正需要做的是删除用户和活动之间的关联(也就是EventUser中间表的记录)。下面是具体的解决步骤:
1. 配置符合REST规范的嵌套路由
首先,我们需要在路由文件中添加针对EventUser的销毁路由,最好嵌套在events下,这样能明确是删除某个活动下的用户关联:
# config/routes.rb resources :events do resources :event_users, only: [:destroy] end
执行rails routes可以看到生成的路由是event_event_user DELETE /events/:event_id/event_users/:id(.:format),这正是我们需要的。
2. 修改视图中的link_to代码
接下来要在视图里找到当前用户对应的EventUser记录,然后把link_to指向这个关联记录的销毁路径:
<% @event.users.each_with_index do |user, index| %> <li> <%= user.try(:display_name) %> <%# 找到当前活动与该用户的关联记录 %> <% event_user = @event.event_users.find_by(user_id: user.id) %> <%= link_to "delete", event_event_user_path(@event, event_user), method: :delete, class: 'btn', data: { confirm: 'Are you sure?' } %> </li> <% end %>
3. 实现EventUsersController的destroy动作
最后需要创建对应的控制器来处理销毁关联的逻辑:
# app/controllers/event_users_controller.rb class EventUsersController < ApplicationController def destroy @event = Event.find(params[:event_id]) @event_user = @event.event_users.find(params[:id]) @event_user.destroy # 销毁后跳回活动页面,提示成功信息 redirect_to @event, notice: '用户已成功从活动中移除。' end end
为什么原来的代码不行?
原来的link_to "delete", user, method: :delete中,第二个参数user会被Rails解析为user_path(user),也就是用户资源的销毁路由,所以触发的是UsersController#destroy,自然会删除整个User对象。而我们要操作的是中间表的关联记录,必须指向EventUser的销毁路由才行。
内容的提问来源于stack exchange,提问作者phauwn
相关产品推荐
相关产品推荐

