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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

Q&A

解決済

1回答

996閲覧

Formオブジェクトにおいての保存について

jou_greeeen

総合スコア2

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

0グッド

2クリップ

投稿2022/05/19 11:53

編集2022/05/20 08:35

お世話になっています。
現在メルカリのようなフリマアプリを作成中です。

商品投稿にこの後機能を付け足したく、そのために商品投稿をFormオブジェクトとして書き直しているところです。下記のような記述で実装したところうまく保存できなくなってしまいました。

試したこと

画像の保存ができていないと思いcreateの引数の書き方を変えてみたり、いろいろ弄っているうちにどこが間違っているのかも分からなくなりもう一度データの送り方、受け取り方の基礎を学習し直したり一週間ほど頑張ってみましたがダメでした。

item_form.rb

1class ItemForm 2 include ActiveModel::Model 3 attr_accessor :name, :description, :category_id, :condition_id, :shipping_fee_id, :shipping_from_id, :shipping_day_id, :price, :user_id, :images 4 5 validates :name, presence: true 6 validates :description, presence: true 7 validates :category_id, numericality: { other_than: 1, message: "can't be blank" } 8 validates :condition_id, numericality: { other_than: 1, message: "can't be blank" } 9 validates :shipping_fee_id, numericality: { other_than: 1, message: "can't be blank" } 10 validates :shipping_from_id, numericality: { other_than: 1, message: "can't be blank" } 11 validates :shipping_day_id, numericality: { other_than: 1, message: "can't be blank" } 12 validates :price, numericality: { only_integer: true } 13 validates :user_id, presence: true 14 validates :images, length: { minimum: 1, maximum: 5, message: "は1枚以上5枚以下にしてください" } 15 16 def save 17 Item.create(user_id: user_id, name: name, description: description, category_id: category_id, condition_id: condition_id, shipping_fee_id: shipping_fee_id, shipping_from_id: shipping_from_id, shipping_day_id: shipping_day_id, price: price, images: images) 18 end 19end

items_controller

1 def new 2 @item_form = ItemForm.new 3 end 4 5 def create 6 @item_form = ItemForm.new(item_params) 7 if @item_form.valid? 8 @item_form.save 9 redirect_to root_path 10 else 11 render :new 12 end 13 end 14 15 private 16 17 def item_params 18 params.require(:item_form).permit(:name, :description, :category_id, :condition_id, :shipping_fee_id, :shipping_from_id, :shipping_day_id, :price, images: []).merge(user_id: current_user.id) 19 end

items/new.html.erb

1 <%= form_with model: @item_form, url: items_path, id: 'new_post', local: true do |f| %> 2 3 <%# インスタンスを渡して、エラー発生時にメッセージが表示されるようにしましょう。%> 4 <%# render 'shared/error_messages', model: f.object %> 5 <%# //インスタンスを渡して、エラー発生時にメッセージが表示されるようにしましょう。%> 6 7 <%# 商品画像 %> 8 <div class="img-upload"> 9 <div class="weight-bold-text"> 10 商品画像 11 <span class="indispensable">必須</span> 12 </div> 13 <div class="click-upload"> 14 <p> 15 クリックしてファイルをアップロード 16 </p> 17 <%= f.file_field :images, id:"item-image", name: 'item[images][]', data: {index: 0} %> 18 </div> 19 <div id="previews"> 20 </div> 21 </div> 22 <%# /商品画像 %> 23 <%# 商品名と商品説明 %> 24 <div class="new-items"> 25 <div class="weight-bold-text"> 26 商品名 27 <span class="indispensable">必須</span> 28 </div> 29 <%= f.text_area :name, class:"items-text", id:"item-name", placeholder:"商品名(必須 40文字まで)", maxlength:"40" %> 30 <div class="items-explain"> 31 <div class="weight-bold-text"> 32 商品の説明 33 <span class="indispensable">必須</span> 34 </div> 35 <%= f.text_area :description, class:"items-text", id:"item-info", placeholder:"商品の説明(必須 1,000文字まで)(色、素材、重さ、定価、注意点など)例)2010年頃に1万円で購入したジャケットです。ライトグレーで傷はありません。あわせやすいのでおすすめです。" ,rows:"7" ,maxlength:"1000" %> 36 </div> 37 </div> 38 <%# /商品名と商品説明 %> 39 40 <%# 商品の詳細 %> 41 <div class="items-detail"> 42 <div class="weight-bold-text">商品の詳細</div> 43 <div class="form"> 44 <div class="weight-bold-text"> 45 カテゴリー 46 <span class="indispensable">必須</span> 47 </div> 48 <%= f.collection_select(:category_id, Category.all, :id, :name, {}, {class:"select-box", id:"item-category"}) %> 49 <div class="weight-bold-text"> 50 商品の状態 51 <span class="indispensable">必須</span> 52 </div> 53 <%= f.collection_select(:condition_id, Condition.all, :id, :name, {}, {class:"select-box", id:"item-sales-status"}) %> 54 </div> 55 </div> 56 <%# /商品の詳細 %> 57 58 <%# 配送について %> 59 <div class="items-detail"> 60 <div class="weight-bold-text question-text"> 61 <span>配送について</span> 62 <a class="question" href="#">?</a> 63 </div> 64 <div class="form"> 65 <div class="weight-bold-text"> 66 配送料の負担 67 <span class="indispensable">必須</span> 68 </div> 69 <%= f.collection_select(:shipping_fee_id, ShippingFee.all, :id, :name, {}, {class:"select-box", id:"item-shipping-fee-status"}) %> 70 <div class="weight-bold-text"> 71 発送元の地域 72 <span class="indispensable">必須</span> 73 </div> 74 <%= f.collection_select(:shipping_from_id, ShippingFrom.all, :id, :name, {}, {class:"select-box", id:"item-prefecture"}) %> 75 <div class="weight-bold-text"> 76 発送までの日数 77 <span class="indispensable">必須</span> 78 </div> 79 <%= f.collection_select(:shipping_day_id, ShippingDay.all, :id, :name, {}, {class:"select-box", id:"item-scheduled-delivery"}) %> 80 </div> 81 </div> 82 <%# /配送について %> 83 84 <%# 販売価格 %> 85 <div class="sell-price"> 86 <div class="weight-bold-text question-text"> 87 <span>販売価格<br>(¥300〜9,999,999)</span> 88 <a class="question" href="#">?</a> 89 </div> 90 <div> 91 <div class="price-content"> 92 <div class="price-text"> 93 <span>価格</span> 94 <span class="indispensable">必須</span> 95 </div> 96 <span class="sell-yen">¥</span> 97 <%= f.text_field :price, class:"price-input", id:"item-price", placeholder:"例)300" %> 98 </div> 99 <div class="price-content"> 100 <span>販売手数料 (10%)</span> 101 <span> 102 <span id='add-tax-price'></span>円 103 </span> 104 </div> 105 <div class="price-content"> 106 <span>販売利益</span> 107 <span> 108 <span id='profit'></span>円 109 </div> 110 </span> 111 </div> 112 </div> 113 <%# /販売価格 %> 114 115 <%# 注意書き %> 116 <div class="caution"> 117 <p class="sentence"> 118 <a href="#">禁止されている出品、</a> 119 <a href="#">行為</a> 120 を必ずご確認ください。 121 </p> 122 <p class="sentence"> 123 またブランド品でシリアルナンバー等がある場合はご記載ください。 124 <a href="#">偽ブランドの販売</a> 125 は犯罪であり処罰される可能性があります。 126 </p> 127 <p class="sentence"> 128 また、出品をもちまして 129 <a href="#">加盟店規約</a> 130 に同意したことになります。 131 </p> 132 </div> 133 <%# /注意書き %> 134 <%# 下部ボタン %> 135 <div class="sell-btn-contents"> 136 <%= f.submit "出品する" ,class:"sell-btn" %> 137 <%=link_to 'もどる', root_path, class:"back-btn" %> 138 </div> 139 <%# /下部ボタン %> 140 </div> 141 <% end %>

models/item.rb

1class Item < ApplicationRecord 2 extend ActiveHash::Associations::ActiveRecordExtensions 3 belongs_to :user 4 has_one :purchase_log 5 has_many_attached :images 6 belongs_to :category 7 belongs_to :condition 8 belongs_to :shipping_day 9 belongs_to :shipping_fee 10 belongs_to :shipping_from 11 12 validates :name, presence: true 13 validates :description, presence: true 14 validates :category_id, numericality: { other_than: 1, message: "can't be blank" } 15 validates :condition_id, numericality: { other_than: 1, message: "can't be blank" } 16 validates :shipping_fee_id, numericality: { other_than: 1, message: "can't be blank" } 17 validates :shipping_from_id, numericality: { other_than: 1, message: "can't be blank" } 18 validates :shipping_day_id, numericality: { other_than: 1, message: "can't be blank" } 19 validates :price, numericality: { only_integer: true } 20 validates :images, length: { minimum: 1, maximum: 5, message: "は1枚以上5枚以下にしてください" } 21end 22

他の箇所のコードが見たい場合是非お申し付けください!
当方一週間も解決できずだいぶメンタルにきてしまっています。
ぜひご教示願います

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

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

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

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

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

shinoharat

2022/05/20 06:07

> 下記のような記述で実装したところうまく保存できなくなってしまいました。 「うまく保存できない」とは具体的にどういう状況でしょうか? ・保存ボタン押下時にバリデーションエラーが発生する(render :new される) ・保存ボタン押下時に例外が発生する ・エラーは発生せず root_path に遷移するが、データが更新されてない など、症状を詳しく教えてほしいです。
jou_greeeen

2022/05/20 08:09

コメントありがとうございます。 保存ボタン押下時にバリデーションエラーが発生する(render :new される)の状態です。
shinoharat

2022/05/20 08:12

app/models/item.rb の内容も質問文に追加していただけると助かります🙏
shinoharat

2022/05/20 08:17

> 保存ボタン押下時にバリデーションエラーが発生する(render :new される)の状態です。 どのようなデータを登録しようとして、どのようなバリデーションエラーが発生しているのでしょうか? render :new の直前の「item_params」と「@item_form.errors.full_messages」の値を教えてください。
jou_greeeen

2022/05/20 08:37

app/models/item.rb追加しました! item_params > {"name"=>"test", "description"=>"test", "category_id"=>"2", "condition_id"=>"6", "shipping_fee_id"=>"3", "shipping_from_id"=>"2", "shipping_day_id"=>"2", "price"=>"300", "user_id"=>1} @item_form.errors.full_messages > "Images is too short (minimum is 1 character)" です。
shinoharat

2022/05/21 02:52

ありがとうございます。 確認します。
guest

回答1

0

ベストアンサー

ファイルフィールドの name 属性を修正してみてください。

diff

1- <%= f.file_field :images, ..., name: 'item[images][]', ... %> 2+ <%= f.file_field :images, ..., name: 'item_form[images][]', ... %>

投稿2022/05/21 03:04

shinoharat

総合スコア1676

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

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

jou_greeeen

2022/05/22 02:55

無事保存できるようになりました! 親身になって教えてくださりありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問