You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RoR测验生成器开发:Poll表插入数据遇ActionController::ParameterMissing错误

解决RoR测验生成器中Poll数据批量插入的参数错误问题

首先,咱们先搞清楚你遇到的错误原因:你修改视图后用了"poll"+i.to_s作为单选按钮的命名,导致表单提交的参数是poll0[answer_id]、poll1[answer_id]这类格式,但你的控制器poll_params方法要求的是poll这个参数名,所以Rails找不到对应的参数,就抛出了ActionController::ParameterMissing错误。

要解决这个问题,咱们需要调整参数传递的方式,让每个问题对应的投票数据以数组形式提交,这样控制器就能批量处理并创建多个Poll记录。下面是具体的分步解决方案:

1. 完善模型关联

首先确保你的Formulaire模型和Poll的关联配置完整,并且允许嵌套属性(方便批量处理):

class Formulaire < ActiveRecord::Base
  has_many :polls, dependent: :destroy
  accepts_nested_attributes_for :polls # 启用嵌套属性支持
end

你的Poll模型已经有belongs_to :formulaire,这部分保持不变就好。

2. 调整控制器的参数处理和创建逻辑

修改PollsController的create方法和参数过滤方法,支持批量接收Poll参数:

class PollsController < ApplicationController
  def create
    @formulaire = Formulaire.find(params[:formulaire_id])
    
    # 遍历提交的poll参数,为每个选中的答案创建Poll记录
    if params[:formulaire] && params[:formulaire][:polls_attributes]
      params[:formulaire][:polls_attributes].each do |_key, poll_attrs|
        next if poll_attrs[:answer_id].blank? # 跳过未选择答案的问题
        @formulaire.polls.create(poll_attrs)
      end
    end

    redirect_to @formulaire, notice: '所有投票选项已成功保存'
  end

  private

  # 调整参数过滤,允许嵌套的polls属性数组
  def formulaire_params
    params.require(:formulaire).permit(polls_attributes: [:question_id, :answer_id, :nom])
  end
end

3. 修改视图,使用嵌套表单字段

把你的视图改成用fields_for生成每个问题对应的Poll表单字段,这样Rails会自动生成正确的数组格式参数:

<%= form_for(@formulaire) do |f| %>
  <% @formulaire.questions.each do |question| %>
    <li>
      <%= h question.nom %>
      <ul>
        <!-- 为每个问题生成一个Poll的嵌套字段 -->
        <%= f.fields_for :polls, @formulaire.polls.new(question_id: question.id, nom: @formulaire.nom) do |poll_fields| %>
          <% question.answers.each do |answer| %>
            <%= poll_fields.radio_button :answer_id, answer.id %>
            <%= h answer.content %>
            <br/>
          <% end %>
          <!-- 隐藏字段传递question_id和nom,无需用户输入 -->
          <%= poll_fields.hidden_field :question_id, value: question.id %>
          <%= poll_fields.hidden_field :nom, value: @formulaire.nom %>
        <% end %>
      </ul>
    </li>
  <% end %>

  <%= f.submit '提交投票' %>
<% end %>

为什么这个方案可行?

  • 使用fields_for :polls会让表单生成formulaire[polls_attributes][0][answer_id]、formulaire[polls_attributes][1][answer_id]这样的参数,正好匹配我们控制器中formulaire_params的过滤规则。
  • 每个问题对应一个Poll的表单块,确保用户为每个问题选择的答案都能被单独保存为一条Poll记录。
  • 隐藏字段自动传递question_id和nom,避免用户手动输入这些关联信息。

这样修改后,你就能为每个问题的选中答案创建对应的Poll记录,同时也解决了参数缺失的错误。

内容的提问来源于stack exchange,提问作者user9007028

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:23:03