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

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

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

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

Q&A

0回答

1395閲覧

param is missing or the value is empty: itemの解消したい

hrmyg

総合スコア0

Ruby on Rails

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

0グッド

0クリップ

投稿2020/12/28 06:46

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
クローンのフリマアプリの購入機能で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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

winterboum

2020/12/31 05:16

2点気になります。 form_with model: [@item, @buy_address], の @buy_address が nilでは? params の構造が違う気がする。 logで確認して載せてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問