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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

1回答

636閲覧

【Rails】SQLite3::ConstraintException: NOT NULL constraint failedエラー

yummmmmmm

総合スコア4

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2022/04/06 14:50

前提・実現したいこと

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Formオブジェクトでの実装でなく、
accepts_nested_attributes_for
を用いた実装に切り替えることで実装することができました。
accepts_nested_attributes_forにはウィークポイントもあるようなので、
その点を理解した上で使用したいと思います。

投稿2022/04/07 13:55

編集2022/04/09 04:28
yummmmmmm

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問