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

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

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

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

Ruby on Rails 6

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

解決済

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

jou_greeeen
jou_greeeen

総合スコア2

Ruby

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

Ruby on Rails 6

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

1回答

0評価

2クリップ

189閲覧

投稿2022/05/19 11:53

編集2022/05/22 11:55

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

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

試したこと

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

item_form.rb

class ItemForm include ActiveModel::Model attr_accessor :name, :description, :category_id, :condition_id, :shipping_fee_id, :shipping_from_id, :shipping_day_id, :price, :user_id, :images validates :name, presence: true validates :description, presence: true validates :category_id, numericality: { other_than: 1, message: "can't be blank" } validates :condition_id, numericality: { other_than: 1, message: "can't be blank" } validates :shipping_fee_id, numericality: { other_than: 1, message: "can't be blank" } validates :shipping_from_id, numericality: { other_than: 1, message: "can't be blank" } validates :shipping_day_id, numericality: { other_than: 1, message: "can't be blank" } validates :price, numericality: { only_integer: true } validates :user_id, presence: true validates :images, length: { minimum: 1, maximum: 5, message: "は1枚以上5枚以下にしてください" } def save 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) end end

items_controller

def new @item_form = ItemForm.new end def create @item_form = ItemForm.new(item_params) if @item_form.valid? @item_form.save redirect_to root_path else render :new end end private def item_params 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) end

items/new.html.erb

<%= form_with model: @item_form, url: items_path, id: 'new_post', local: true do |f| %> <%# インスタンスを渡して、エラー発生時にメッセージが表示されるようにしましょう。%> <%# render 'shared/error_messages', model: f.object %> <%# //インスタンスを渡して、エラー発生時にメッセージが表示されるようにしましょう。%> <%# 商品画像 %> <div class="img-upload"> <div class="weight-bold-text"> 商品画像 <span class="indispensable">必須</span> </div> <div class="click-upload"> <p> クリックしてファイルをアップロード </p> <%= f.file_field :images, id:"item-image", name: 'item[images][]', data: {index: 0} %> </div> <div id="previews"> </div> </div> <%# /商品画像 %> <%# 商品名と商品説明 %> <div class="new-items"> <div class="weight-bold-text"> 商品名 <span class="indispensable">必須</span> </div> <%= f.text_area :name, class:"items-text", id:"item-name", placeholder:"商品名(必須 40文字まで)", maxlength:"40" %> <div class="items-explain"> <div class="weight-bold-text"> 商品の説明 <span class="indispensable">必須</span> </div> <%= f.text_area :description, class:"items-text", id:"item-info", placeholder:"商品の説明(必須 1,000文字まで)(色、素材、重さ、定価、注意点など)例)2010年頃に1万円で購入したジャケットです。ライトグレーで傷はありません。あわせやすいのでおすすめです。" ,rows:"7" ,maxlength:"1000" %> </div> </div> <%# /商品名と商品説明 %> <%# 商品の詳細 %> <div class="items-detail"> <div class="weight-bold-text">商品の詳細</div> <div class="form"> <div class="weight-bold-text"> カテゴリー <span class="indispensable">必須</span> </div> <%= f.collection_select(:category_id, Category.all, :id, :name, {}, {class:"select-box", id:"item-category"}) %> <div class="weight-bold-text"> 商品の状態 <span class="indispensable">必須</span> </div> <%= f.collection_select(:condition_id, Condition.all, :id, :name, {}, {class:"select-box", id:"item-sales-status"}) %> </div> </div> <%# /商品の詳細 %> <%# 配送について %> <div class="items-detail"> <div class="weight-bold-text question-text"> <span>配送について</span> <a class="question" href="#">?</a> </div> <div class="form"> <div class="weight-bold-text"> 配送料の負担 <span class="indispensable">必須</span> </div> <%= f.collection_select(:shipping_fee_id, ShippingFee.all, :id, :name, {}, {class:"select-box", id:"item-shipping-fee-status"}) %> <div class="weight-bold-text"> 発送元の地域 <span class="indispensable">必須</span> </div> <%= f.collection_select(:shipping_from_id, ShippingFrom.all, :id, :name, {}, {class:"select-box", id:"item-prefecture"}) %> <div class="weight-bold-text"> 発送までの日数 <span class="indispensable">必須</span> </div> <%= f.collection_select(:shipping_day_id, ShippingDay.all, :id, :name, {}, {class:"select-box", id:"item-scheduled-delivery"}) %> </div> </div> <%# /配送について %> <%# 販売価格 %> <div class="sell-price"> <div class="weight-bold-text question-text"> <span>販売価格<br>(¥300〜9,999,999)</span> <a class="question" href="#">?</a> </div> <div> <div class="price-content"> <div class="price-text"> <span>価格</span> <span class="indispensable">必須</span> </div> <span class="sell-yen">¥</span> <%= f.text_field :price, class:"price-input", id:"item-price", placeholder:"例)300" %> </div> <div class="price-content"> <span>販売手数料 (10%)</span> <span> <span id='add-tax-price'></span>円 </span> </div> <div class="price-content"> <span>販売利益</span> <span> <span id='profit'></span>円 </div> </span> </div> </div> <%# /販売価格 %> <%# 注意書き %> <div class="caution"> <p class="sentence"> <a href="#">禁止されている出品、</a> <a href="#">行為</a> を必ずご確認ください。 </p> <p class="sentence"> またブランド品でシリアルナンバー等がある場合はご記載ください。 <a href="#">偽ブランドの販売</a> は犯罪であり処罰される可能性があります。 </p> <p class="sentence"> また、出品をもちまして <a href="#">加盟店規約</a> に同意したことになります。 </p> </div> <%# /注意書き %> <%# 下部ボタン %> <div class="sell-btn-contents"> <%= f.submit "出品する" ,class:"sell-btn" %> <%=link_to 'もどる', root_path, class:"back-btn" %> </div> <%# /下部ボタン %> </div> <% end %>

models/item.rb

class Item < ApplicationRecord extend ActiveHash::Associations::ActiveRecordExtensions belongs_to :user has_one :purchase_log has_many_attached :images belongs_to :category belongs_to :condition belongs_to :shipping_day belongs_to :shipping_fee belongs_to :shipping_from validates :name, presence: true validates :description, presence: true validates :category_id, numericality: { other_than: 1, message: "can't be blank" } validates :condition_id, numericality: { other_than: 1, message: "can't be blank" } validates :shipping_fee_id, numericality: { other_than: 1, message: "can't be blank" } validates :shipping_from_id, numericality: { other_than: 1, message: "can't be blank" } validates :shipping_day_id, numericality: { other_than: 1, message: "can't be blank" } validates :price, numericality: { only_integer: true } validates :images, length: { minimum: 1, maximum: 5, message: "は1枚以上5枚以下にしてください" } end

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby

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

Ruby on Rails 6

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