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

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

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

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

Q&A

解決済

1回答

343閲覧

親モデルと一緒に子レコードを一括で登録したい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 6

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

0グッド

0クリップ

投稿2021/07/28 05:18

編集2021/07/28 06:03

実現したいこと

親モデルと一緒に子レコードを一括で登録したいです。

親→posts
子→items

親である、image, image_title, descriptionは入力後、保存され表示されるのですが
子の入力データがnilになってしまい保存・表示ができない状態です。

何か原因などわかる方いらっしゃいましたらアドバイスお願い致します。

導入済み
・gem cocoon

コントローラー

**postscontroller** class PostsController < ApplicationController before_action :ensure_correct_user, {only: [:edit, :update, :destroy]} def index @posts = Post.all.order(created_at: :desc) end def show @post = Post.find_by(id: params[:id]) @user = @post.user end def new @post = Post.new @post.items.build end def create @post = Post.new(post_params) @post.user_id = @current_user.id if @post.save @post.image="#{@post.id}.jpg" redirect_to("/posts/#{@post.id}") else render("/posts/new") end end def edit @post = Post.find_by(id: params[:id]) end def update @post = Post.find_by(id: params[:id]) @post.image_title = params[:image_title] @post.price = params[:price] @post.image_photo="#{@post.id}.jpg" image=params[:image_photo] File.binwrite("app/assets/images/posts/#{@post.image_photo}", image.read) if @post.save redirect_to("/posts/#{@post.id}") else render("posts/#{@post.id}/edit") end end def destroy @post = Post.find_by(id: params[:id]) @post.destroy redirect_to("/") end def ensure_correct_user @post = Post.find_by(id: params[:id]) if @post.user_id != @current_user.id flash[:notice] = "権限がありません" redirect_to("/posts/index") end end private def post_params params.require(:post).permit(:image, :image_title, :description, items_attributes: [:item_image, :products_name, :brand, :size, :price, :id, :_destroy]) end end

Modelの記載

######親:Post.rb

class Post < ApplicationRecord belongs_to :user has_many :items, inverse_of: :post, dependent: :destroy accepts_nested_attributes_for :items, allow_destroy: true validates :user_id, {presence: true} mount_uploader :image, ImageUploader def user return User.find_by(id: self.user_id) end end

######子:Item.rb

class Item < ApplicationRecord belongs_to :post end

form(html)

html

1**posts/new.html** 2<div class="main posts-new"> 3 <div class="container"> 4 <h1 class="form-heading">投稿画面</h1> 5 6 <%= form_with(model: @post, local: true) do |s| %> 7 8 <p>メイン写真(コーディネート写真)</p> 9 <label for="file_photo"> 10 <%= s.file_field :image %> 11 </label><br> 12 <div class="msr_text_05"> 13 <label>タイトル</label> 14 <%= s.text_field :image_title %><br> 15 </div> 16 <div class="msr_text_05"> 17 <label>説明</label> 18 <%= s.text_field :description %> 19 </div> 20 <div class="parents"> 21 <%= s.fields_for :items do |t| %> 22 <%= render "posts/items_fields", f: t %> 23 <% end %> 24 <div class="links"> 25 <%= link_to_add_association "+アイテム入力フォーム追加", s, :items, partial: 'items_fields' %> 26 </div> 27 </div><br> 28 <div class="actions"> 29 <%= s.submit "投稿" %> 30 </div> 31 <% end %> 32 <br> 33 <%= link_to("トップページへ戻る", "/") %> 34 </div> 35</div>

html

1**posts/_items_fields.html** 2<div class="nested-fields"> 3 <table> 4 <tr> 5 <td class="td-fixed-select"> 6 7 <%= f.fields_for :items do |t| %> 8 <div class="msr_file_05"> 9 <p>アイテム写真</p> 10 <label for="file_photo"> 11 画像を選択してください 12 <%= t.file_field :item_image %> 13 </label> 14 </div> 15 <div class="msr_text_05"> 16 <label>商品名</label> 17 <%= t.text_field :products_name %> 18 </div> 19 <div class="msr_text_05"> 20 <label>ブランド</label> 21 <%= t.text_field :brand %> 22 </div> 23 <div class="msr_text_05"> 24 <label>サイズ</label> 25 <%= t.text_field :size %> 26 </div> 27 <div class="msr_text_05"> 28 <label>価格</label> 29 <%= t.text_field :price %> 30 </div> 31 <!-- 削除ボタン --> 32 <%= link_to_remove_association "アイテムを削除", f %> 33 <% end %> 34 </td> 35 </tr> 36 </table> 37</div>

html

1**posts/show.html** 2<div class="main posts-show"> 3 <div class="container"> 4 <div class="posts-show-item"> 5 <%= link_to(@user.name, "/users/#{@user.id}") %> 6 <p> 7 <%= image_tag @post.image.url %> 8 </p> 9 <p> 10 <%= @post.image_title %> 11 </p> 12 <p> 13 <%= @post.description %> 14 </p> 15 16 <%= form_tag("/posts/items_fields") do %> 17 <p><span>アイテム名</span> 18 <%= @post.products_name %> 19 </p> 20 <p><span>ブランド</span> 21 <%= @post.brand %> 22 </p> 23 <p><span>サイズ</span> 24 <%= @post.size %> 25 </p> 26 <p><span>&yen;</span> 27 <%= @post.price %> 28 </p> 29 <% end %> 30 31 <div class="post-time"> 32 <%= @post.created_at.strftime("%Y-%m-%d") %> 33 </div> 34 <% if @post.user_id == @current_user.id %> 35 <div class="post-menus"> 36 <%= link_to("編集", "/posts/#{@post.id}/edit") %> 37 <%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %> 38 </div> 39 <% end %> 40 </div> 41 </div> 42 <%= link_to("トップページへ", "/") %> 43</div>

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

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

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

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

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

guest

回答1

0

ベストアンサー

実装方法変更のため解決済みにします。

投稿2021/08/04 12:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問