前提・実現したいこと
ここに質問の内容を詳しく書いてください。
クローンのフリマアプリの購入機能でitem,buy,addressでFormオブジェクトを使用して複数のテーブルにデータを保存するところを作成しています。しかし、購入ボタンを押して、データを保存しようとしたら、「param is missing or the value is empty: item」のようなエラーが出ました。
もし良ければ、エラー解決の手助けをしていただきたいです。よろしくお願いします。
また、他のコードが必要な場合があればお申し付けください。
発生している問題・エラーメッセージ
ActionController::ParameterMissing in ItemsController#create param is missing or the value is empty: item def item_params params.require(:item).permit(:name, :explanation, :category_id, :state_id, :shipping_cost_id, :prefecture_id, :price, :shipping_day_id, :image).merge(user_id: current_user.id) end
該当のソースコード
ItemsCcontroller
ruby
1class ItemsController < ApplicationController 2 before_action :authenticate_user!, only: [:new, :edit, :update, :destroy] 3 before_action :set_item, only: [:show, :edit, :update, :destroy] 4 def index 5 @items = Item.all.order(created_at: :desc) 6 end 7 8 def new 9 @item = Item.new 10 end 11 12 def create 13 @item = Item.new(item_params) 14 if @item.save 15 redirect_to root_path 16 else 17 render :new 18 end 19 end 20 21 def show 22 end 23 24 def edit 25 unless current_user.id == @item.user_id 26 redirect_to root_path 27 end 28 end 29 30 def update 31 if @item.update(item_params) 32 redirect_to item_path 33 else 34 render :edit 35 end 36 end 37 38 def destroy 39 if current_user.id == @item.user_id 40 if @item.destroy 41 redirect_to root_path 42 else 43 render :edit 44 end 45 else 46 render :index 47 end 48 end 49 50 private 51 52 def item_params 53 params.require(:item).permit(:name, :explanation, :category_id, :state_id, :shipping_cost_id, :prefecture_id, :price, 54 :shipping_day_id, :image).merge(user_id: current_user.id) 55 end 56 57 def set_item 58 @item = Item.find(params[:id]) 59 end 60end 61
buy_address.rb
ruby
1class BuyAddress 2 include ActiveModel::Model 3 attr_accessor :post_code, :prefecture_id, :city, :address, :building, :phone_number, :item_id, :user_id 4 5 with_options presence: true do 6 validates :post_code, format: {with: /\A\d{3}[-]\d{4}\z/} 7 validates :city, format: {with: /\A[ぁ-んァ-ン一-龥]/} 8 validates :address 9 validates :phone_number, format: {with: /\A\d{10}\z|\A\d{11}\z/} 10 validates :token 11 end 12 13 validates :prefecture_id, numericality: {other_than: 1} 14 15 def save 16 buy = Buy.create(user_id: user_id, item_id: item_id) 17 Address.create(post_code: post_code, prefecture_id: prefecture_id, city: city, address: address, building: building, phone_number: phone_number, buy_id: buy_id) 18 end 19end
BuysController
ruby
1class BuysController < ApplicationController 2 def index 3 @buy_address = BuyAddress.new 4 end 5 6 def new 7 end 8 9 def create 10 @buy_address = BuyAddress.new(buy_params) 11 if @buy_address.valid? 12 @buy_address.save 13 redirect_to rootpath 14 else 15 render action: :index 16 end 17 end 18 19 private 20 21 def buy_params 22 params.permit(:post_code, :prefecture_id, :city, :address, :building, :phone_number, :item_id).merge(user_id: cuurent_user.id) 23 end 24end 25
buys/index.html.erb
<%= render "shared/second-header"%> <div class='transaction-contents'> <div class='transaction-main'> <h1 class='transaction-title-text'> 購入内容の確認 </h1> <%# 購入内容の表示 %> <div class='buy-item-info'> <%= image_tag @item.image, "item-sample.png", class: 'buy-item-img' %> <div class='buy-item-right-content'> <h2 class='buy-item-text'> <%= @item.naem %> </h2> <div class='buy-item-price'> <p class='item-price-text'>¥<%= @item.price %></p> <p class='item-price-sub-text'><%= @item.shipping_cost.name %></p> </div> </div> </div> <%# /購入内容の表示 %> <%# 支払額の表示 %> <div class='item-payment'> <h1 class='item-payment-title'> 支払金額 </h1> <p class='item-payment-price'> ¥<%= "販売価格" %> </p> </div> <%# /支払額の表示 %> <%= form_with model: [@item, @buy_address], url: items_path, id: 'charge-form', class: 'transaction-form-wrap',local: true do |f| %> <%# カード情報の入力 %> <div class='credit-card-form'> <h1 class='info-input-haedline'> クレジットカード情報入力 </h1> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">カード情報</label> <span class="indispensable">必須</span> </div> <%= f.text_field 'hoge', class:"input-default", id:"card-number", placeholder:"カード番号(半角英数字)", maxlength:"16" %> <div class='available-card'> <%= image_tag 'card-visa.gif', class: 'card-logo'%> <%= image_tag 'card-mastercard.gif', class: 'card-logo'%> <%= image_tag 'card-jcb.gif', class: 'card-logo'%> <%= image_tag 'card-amex.gif', class: 'card-logo'%> </div> </div> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">有効期限</label> <span class="indispensable">必須</span> </div> <div class='input-expiration-date-wrap'> <%= f.text_area 'hoge', class:"input-expiration-date", id:"card-exp-month", placeholder:"例)3" %> <p>月</p> <%= f.text_area 'hoge', class:"input-expiration-date", id:"card-exp-year", placeholder:"例)23" %> <p>年</p> </div> </div> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">セキュリティコード</label> <span class="indispensable">必須</span> </div> <%= f.text_field "hoge",class:"input-default", id:"card-cvc", placeholder:"カード背面4桁もしくは3桁の番号", maxlength:"4" %> </div> </div> <%# /カード情報の入力 %> <%# 配送先の入力 %> <div class='shipping-address-form'> <h1 class='info-input-haedline'> 配送先入力 </h1> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">郵便番号</label> <span class="indispensable">必須</span> </div> <%= f.text_field :post_code, class:"input-default", id:"postal-code", placeholder:"例)123-4567", maxlength:"8" %> </div> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">都道府県</label> <span class="indispensable">必須</span> </div> <%= f.collection_select(:prefcture_id, Prefecture.all, :id, :name, {}, {class:"select-box", id:"prefecture"}) %> </div> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">市区町村</label> <span class="indispensable">必須</span> </div> <%= f.text_field :city, class:"input-default", id:"city", placeholder:"例)横浜市緑区"%> </div> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">番地</label> <span class="indispensable">必須</span> </div> <%= f.text_field :address, class:"input-default", id:"addresses", placeholder:"例)青山1-1-1"%> </div> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">建物名</label> <span class="form-any">任意</span> </div> <%= f.text_field :building, class:"input-default", id:"building", placeholder:"例)柳ビル103"%> </div> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">電話番号</label> <span class="indispensable">必須</span> </div> <%= f.text_field :phone_number, class:"input-default", id:"phone-number", placeholder:"例)09012345678",maxlength:"11"%> </div> </div> <%# /配送先の入力 %> <div class='buy-btn'> <%= f.submit "購入" ,class:"buy-red-btn" %> </div> <% end %> </div> </div> <%= render "shared/second-footer"%>
試したこと
購入機能の保存するときにitemの情報がないと思ったのんで、ビューファイルに「@item name]などの情報を付け加えた。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
2点気になります。
form_with model: [@item, @buy_address], の @buy_address が nilでは?
params の構造が違う気がする。 logで確認して載せてください
あなたの回答
tips
プレビュー