前提・実現したいこと
Railsにて一括登録フォームの実装を試みています。
indexactionからnewactionへ遷移するまでは実装できたのですが、送信後にエラーが起きてしまっており解決策がわからないためご質問させていただきます。
本文下記に添付しておりますサイトを見まねで実装しました。
そのため内容理解が薄いですが、どなたか解決策をご教示いただけますと幸いです。
発生している問題・エラーメッセージ
該当のソースコード
##workoutdiaries_controller class WorkoutdiariesController < ApplicationController before_action :move_to_index, except: :index def new @form = Form::WorkoutdiaryCollection.new end def create @form = Form::WorkoutdiaryCollection.new(workoutdiary_collection_params) if @form.save redirect_to workoutdiaries_path else render :new end end private def move_to_index redirect_to action: :index unless user_signed_in? end def workoutdiary_search_params params.fetch(:search, {}).permit(:menu, :date_from, :date_to, :workoutdate_id) end def workoutdiary_collection_params params .require(:form_workoutdiary_collection) .permit(workoutdiaries_attributes: Form::Workoutdiary::REGISTRABLE_ATTRIBUTES) end end
## models/workoutdiary.rb class Workoutdiary < ApplicationRecord # validates :settype, :weight, :reps, presence: true belongs_to :user validates :user_id, presence: true belongs_to :workoutdate validates :workoutdate_id, presence: true scope :search, -> (search_params) do unless search_params.blank? workoutdate_id_is(search_params[:workoutdate_id]) .date_from(search_params[:date_from]) .date_to(search_params[:date_to]) else Workoutdiary.where(created_at: Date.current.all_day) end end scope :date_from, -> (from) { where('? <= created_at', from) if from.present? } scope :date_to, -> (to) { where('created_at <= ?', to) if to.present? } scope :workoutdate_id_is, -> (workoutdate_id) { where(workoutdate_id: workoutdate_id) if workoutdate_id.present? } end
## models/form/workoutdiary.rb class Form::Workoutdiary < Workoutdiary REGISTRABLE_ATTRIBUTES = %i(workoutdate_id settype weight reps weightsecond repssecond weightthird repsthird) attr_accessor :workoutdate_id end
## models/base.rb class Form::Base include ActiveModel::Model include ActiveModel::Callbacks include ActiveModel::Validations include ActiveModel::Validations::Callbacks end
## models/form/workoutdiary_collection.rb class Form::WorkoutdiaryCollection < Form::Base DEFAULT_ITEM_COUNT = 5 attr_accessor :workoutdiaries def initialize(attributes = {}) super attributes self.workoutdiaries = DEFAULT_ITEM_COUNT.times.map { Form::Workoutdiary.new } unless workoutdiaries.present? end def workoutdiaries_attributes=(attributes) self.workoutdiaries = attributes.map do |_, workoutdiary_attributes| Form::Workoutdiary.new(workoutdiary_attributes).tap { |v| v.availability = false } end end def valid? valid_workoutdiaries = target_workoutdiaries.map(&:valid?).all? super && valid_workoutdiaries end def save return false unless valid? Workoutdiary.transaction { target_workoutdiaries.each(&:save!) } true end def target_workoutdiaries self.workoutdiaries.select { |v| value_to_boolean(v.register) } end end
試したこと
補足情報(FW/ツールのバージョンなど)
Rails 5.2.4.3
ruvy 2.5.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/03 01:32