質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.19%

railsで新規登録を一括で行う時のエラー処理

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 390

amateur1

score 2

railsで新規登録をまとめて行おうとしています。
その際に、以下のようなエラーが出ました。

発生している問題・エラーメッセージ

このページは動作していませんこの問題が何度も発生する場合は、サイト所有者にお問い合わせください。
HTTP ERROR 400

コマンドの方では、下記のエラーが出ました。
Rack::QueryParser::ParameterTypeError (expected Array (got Rack::QueryParser::Params) for param `questions'):

該当のソースコード

question_collection.rb
class QuestionCollection
  include ActiveModel::Conversion
  extend ActiveModel::Naming
  extend ActiveModel::Translation
  include ActiveModel::AttributeMethods
  include ActiveModel::Validations
  QUESTION_NUM = 16  # 同時にクエスションを作成する数
  attr_accessor :collection  # ここに作成したモデルが格納される


  # 初期化メソッド
  def initialize(attributes = [])
    if attributes.present?

      self.collection = attributes.map do |value|
        Question.new(
          answer_start_time: value['answer_start_time'],
          answer_end_time: value['answer_end_time'],
          content: value['content'],
          plan: value['plan'],
          type_id: value['type_id']
        )
      end
    else
      self.collection = QUESTION_NUM.times.map{ Question.new }
    end
  end

  # コレクションをDBに保存するメソッド
  def save
    is_success = true
    ActiveRecord::Base.transaction do
      collection.each do |result|
        # バリデーションを全てかけたいからsave!ではなくsaveを使用
        is_success = false unless result.save
      end
      # バリデーションエラーがあった時は例外を発生させてロールバックさせる
      raise ActiveRecord::RecordInvalid unless is_success
    end
    rescue
      p 'エラー'
    ensure
      return is_success
  end

  # レコードが存在するか確認するメソッド
  def persisted?
    false
  end
end
questions/new.html.erb
<div class="text-center">
    <h1>質問設定</h1>
</div>



<%= form_with model: @questions, url: questions_path, local: true do |form| %>
  <% @questions.collection.each do |question|%>
    <%= fields_for 'questions[]', question do |field| %>

      <div class="field">
        <%= field.label :answer_start_time, '回答開始日時' %>
        <%= field.datetime_select :answer_start_time %>
      </div>

      <div class="field">
        <%= field.label :answer_end_time, '回答終了日時' %>
        <%= field.datetime_select :answer_end_time %>
      </div>      

      <div class="field">
        <%= field.label :content, '質問内容' %>
        <%= field.text_field :content %>
      </div>      

      <div class="field">
        <%= field.label :plan, 'プラン' %>
        <%= field.text_field :plan %>
      </div>

      <div class="field">
        <%= field.label :type_id, 'タイプ' %>
        <%= field.number_field :type_id %>
      </div>




                  </br>
    <% end %>
  <% end %>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>
questions_controller.rb
class QuestionsController < ApplicationController

  def new
    # @question = Question.new
    @questions = QuestionCollection.new
  end

  def create
    @questions = QuestionCollection.new(questions_params)
    if @questions.save
      redirect_to root_url
    else
      render:new
    end
  end

  def destroy
  end

  private

    def questions_params

      params.require(:questions)
    end
end

試したこと

調べましたが、わかりませんでした。

補足情報(FW/ツールのバージョンなど)

下記を参考にしました。
https://qiita.com/Ryoga_aoym/items/91a3940cfa4de268fca4

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る