如何在Rails中结合Viget Fancy Form Modals实现Turbo Streams与嵌套资源的正确交互?
解决嵌套资源下Turbo Stream广播路由缺失course_id的问题
你的核心问题是模型的broadcast回调渲染partial时,没有传递关联的Course对象,导致partial里生成编辑路由时找不到:course_id参数。下面是具体的修复步骤:
1. 修正Courselocation模型的广播回调
在after_update_commit的broadcast_replace_to调用中,需要显式传递course局部变量给partial,同时确保target ID和partial中的ID完全匹配:
class Courselocation < ApplicationRecord belongs_to :course, touch: true, class_name: 'Course', foreign_key: "course_id", optional: true after_update_commit do # 统一target ID为partial中使用的格式 target_id = "admin_#{dom_id(self)}" # 传递course和courselocation局部变量给partial broadcast_replace_to "admin_courselocations", target: target_id, partial: "/admin/courselocations/courselocation", locals: { courselocation: self, course: self.course } broadcast_replace_to "admin_course_sessions_list", target: target_id, partial: "/admin/courselocations/courselocation", locals: { courselocation: self, course: self.course } end end
2. 调整Courselocation Partial,使用局部变量而非全局@course
因为模型广播的上下文没有控制器中的@course变量,所以要修改partial,依赖传递进来的course局部变量生成路由:
<li id="<%= "admin_#{dom_id(courselocation)}" %>" class="card-container card-container-fill-ghost lg-pad-base-all col-lg-4 col-lg-margin"> <section class="col col-lg-12"> <%# 用局部变量course代替@course %> <%= link_to edit_admin_course_courselocation_path(course, courselocation), class: 'row middle location-details-container col-lg-12', data: { "turbo-frame": "modal" } do %> <div class="location-details col-lg-10 col-lg-margin"> <h3><%= courselocation.name %></h3> <h5><%= courselocation.city %>, <%= courselocation.state %></h5> <% if courselocation.address.present? %> <p class="small-text"><%= courselocation.address %></p> <% end %> </div> <div class="col-lg-2"> Manage </div> <% end %> </section> </li>
3. 补充:确保控制器渲染partial时也传递局部变量
在Course编辑视图渲染courselocations列表时,确保传递course变量(虽然控制器里有@course,但显式传递更稳妥):
<%= render @course.courselocations.order(created_at: :desc), locals: { course: @course } %>
为什么这样修复?
- 模型的broadcast回调运行在模型实例上下文,没有控制器的
@course全局变量,必须显式传递关联的self.course给partial。 - partial中的路由
edit_admin_course_courselocation_path需要两个参数:course和courselocation,之前依赖@course导致广播时@course为nil,触发路由缺失参数的错误。
这样修改后,更新Courselocation时,Turbo Stream就能正确渲染partial并替换目标元素,不会再出现路由缺失:course_id的错误了。
内容的提问来源于stack exchange,提问作者Arash Hadipanah
相关产品推荐
相关产品推荐

