前提・実現したいこと
Railsにてレビューサイトの作成を行なっているRails初心者です。
現在、複数モデルへの同時更新及び一括登録フォームの実装を行なっています。(複数の商品への評価を同時に作成する)
複数モデルへの同時更新を実装し、保存ができることを確認した後、一括登録フォームの実装に入りました。
createアクションには進んでいますが、save時にエラーが発生してしまい、解決方法がわからず質問させていただきます。
本文下記に参考としたページを添付いたします。
どなたか解決方法ご教授いただけますと幸いです。
発生している問題・エラーメッセージ
該当のソースコード
class Post < ApplicationRecord belongs_to :user has_many :post_reviews, dependent: :destroy end
class PostForm < Base #include ActiveModel::Model #include ActiveModel::Attributes #include Virtus.model FORM_COUNT = 5 attr_accessor :post_reviews attr_accessor :user_id, :item_name, :item_genre, :item_brand, :good_point, :image_id, :post_id, :star, :id validates :item_name, presence: true validates :item_genre, presence: true validates :item_brand, presence: true def initialize(attributes = {}) super attributes self.post_reviews = FORM_COUNT.times.map{PostReview.new()} unless self.post_reviews.present? end def post_reviews_attributes=(attributes) self.post_reviews=attributes.map{|_,v|PostReview.new(v)} end def save post = Post.create(user_id: user_id) self.post_reviews.each do PostReview.create(post_id: post.id, item_name: item_name, item_genre: item_genre, item_brand: item_brand, good_point: good_point, image_id: image_id, star: star) end end end
class PostsController < ApplicationController def new @post_form = PostForm.new end def create @post_form = PostForm.new(post_form_params) if @post_form.save #@post_form.valid? redirect_to root_path else render action: :new end end def show end def index end def edit end def update end private def post_params params.merge(user_id: current_user.id) end def post_form_params params.require(:post_form) .permit(post_reviews_attributes:[:id, :item_name, :item_genre, :item_brand, :good_point, :image_id, :post_id, :star]) .merge(user_id: current_user.id) end end
<%= form_with model: @post_form, url: posts_path, local:true do |f| %> <%= f.fields_for :post_reviews do |fs| %> <div class="field"> <%= fs.label :"商品名" %><%= fs.text_field :item_name %> </div> <div class="field"> <%= fs.label :"カテゴリ" %><%= fs.select :item_genre, PostReview.item_genres.keys, {prompt: '選択してください'} %> </div> <div class="field"> <%= fs.label :"ブランド" %><%= fs.text_field :item_brand %> </div> <div class="field" id="review_star"> <%= fs.label :"評価" %><%= fs.text_field :star, id: :review_star %> </div> <!--<script> $('#review_star').raty({ size : 36, starOff: '<%= asset_path('star-off.png') %>', starOn : '<%= asset_path('star-on.png') %>', starHalf: '<%= asset_path('star-half.png') %>', scoreName: 'post_form[star]', half: true, }); </script>--> <div class="field"> <%= fs.label :"オススメポイント" %> <%= fs.text_field :good_point %> </div> <% end %> <div class="actions"> <%= f.submit "投稿", name: nil, class: "btn btn-dark" %> </div> <% end %>
試したこと
https://qiita.com/kinop1987/items/63586892116446043365
https://shangang7321.hatenablog.com/entry/2020/08/05/085446
補足情報(FW/ツールのバージョンなど)
Rails 6.1.5
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。