如何在Rails单个视图中为关联多Assignment的Game模型实现多表单编辑
问题原因
你的代码存在3个核心问题:
- 关联调用错误:
@game.assignment为单数写法,你在Game模型中定义的是has_many :assignments,应该调用复数形式@game.assignments才能拿到所有关联的Assignment记录 - 表单结构错误:你为每个Assignment单独创建了独立表单,相当于页面上存在N个互不关联的表单,同时提交按钮写在了所有表单的作用域之外,无法触发任何表单提交
- 未使用Rails嵌套表单能力:无法实现通过一个表单提交多个关联记录的修改需求
修复步骤
1. 调整Game模型,开启嵌套属性支持
在Game模型中新增accepts_nested_attributes_for配置,允许通过Game的表单修改关联的Assignment记录:
class Game < ApplicationRecord has_many :assignments has_many :users, through: :assignments # 新增下面这行,allow_destroy可选,需要支持删除分配时加上 accepts_nested_attributes_for :assignments, allow_destroy: true end
2. 修改控制器逻辑
在GamesController中补充强参数配置,放行Assignment的嵌套修改参数:
class GamesController < ApplicationController def edit @game = Game.find(params[:id]) # 可选:如果需要没有Assignment时默认生成空输入项,可以打开下面注释,比如默认生成3条 # 3.times { @game.assignments.build } if @game.assignments.empty? end def update @game = Game.find(params[:id]) if @game.update(game_params) # 提交成功后的跳转逻辑,比如跳转到Game详情页 redirect_to @game, notice: "分配更新成功" else render :edit end end private def game_params params.require(:game).permit( # 这里补充你Game模型本身需要修改的字段,比如name、match_time等 assignments_attributes: [:id, :user_id, :_destroy] ) end end
3. 重写视图表单
整个表单绑定@game对象,通过simple_fields_for循环渲染所有关联Assignment的输入项:
<%= simple_form_for @game do |f| %> <%= f.error_notification %> <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %> <div class="form-inputs"> <!-- 这里放Game本身需要编辑的字段,如果不需要可以省略 --> <!-- 循环渲染每个Assignment的输入项,有多少条关联记录就生成多少个选择框 --> <%= f.simple_fields_for :assignments do |assignment_form| %> <div class="assignment-item"> <%= assignment_form.input :user_id, label: "C: " do %> <%= assignment_form.select :user_id, User.all.map { |r| [r.first_name, r.id] }, {include_blank: "Select Referee" } %> <% end %> <!-- 可选:需要支持删除单条分配时打开下面注释 --> <!-- <%= assignment_form.check_box :_destroy %> <label>删除该分配</label> --> </div> <% end %> </div> <div class="form-actions"> <%= f.button :submit %> </div> <% end %>
修改完成后,Game关联多少条Assignment,表单就会自动渲染对应数量的选择框,点击提交即可一次性更新所有关联的Assignment记录。
内容的提问来源于stack exchange,提问作者wayoh22
相关产品推荐
相关产品推荐

