お世話になっています。
現在メルカリのようなフリマアプリを作成中です。
商品投稿にこの後機能を付け足したく、そのために商品投稿を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
他の箇所のコードが見たい場合是非お申し付けください!
当方一週間も解決できずだいぶメンタルにきてしまっています。
ぜひご教示願います
まだ回答がついていません
会員登録して回答してみよう