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
相关产品推荐
相关产品推荐

