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

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

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

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

2853閲覧

予想外のところで param is missing or the value is empty: が発生する

begenner

総合スコア79

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2018/05/06 08:42

編集2018/05/10 22:11

現在ECサイトを作成しています。
商品ページを個別に作成し、そこからカートに加える機能を実装したいです。
今参考にしているのは

Rails5でカート機能を作るためのロジックを作ってみた

でViewは自分で付け足してみました。

ですが、カートに入れたい商品を保存する時に

param is missing or the value is empty: cartitem
イメージ説明
イメージ説明
のエラーが発生し、原因がわからず困っています。
わかる方いらっしゃいましたらお手数ですがご教授いだたきますようよろしくお願い申し上げます(m_ _m)

###期待する動作
カートに入れるを押すとその商品がユーザと紐付けられて保存される
###動作環境
OS:mac
Ruby:2.3.5
Ruby on Rails: 4.2.5
MySQL: 5.7.18
devise(gem):4.4.0

###参考サイト
Rails5でカート機能を作るためのロジックを作ってみた

###現在の状況

  • カート機能(カートに入れる、カートの中身を表示する)を実装するための記述はCarts_controllerを作成して書いています。
  • 商品ページは個別に作成しています

###試したこと
@cartitem =Cartitem.new#(cartitem_params)とするとエラーが出ずに画面遷移しました(レコードの登録はできていません)。

###該当のソースコード(必要だと思う部分だけ)
db/schema.rb

ruby

1 #cartitemテーブル 2 create_table "cartitems", force: :cascade do |t| 3 t.integer "quantity", limit: 4 4 t.integer "item_id", limit: 4 5 t.integer "user_id", limit: 4 6 end 7 #商品テーブル 8 create_table "items", force: :cascade do |t| 9 t.string "itemName", limit: 255 10 t.float "price", limit: 24 11 end 12

config/routes.rb

ruby

1 resources :items do 2 member do 3 get 'preview'#個別ページ 4 post '/add_item' => 'carts#add_item'#カートへ追加する 5 end 6

app/controllers/carts_controller.rb

ruby

1class CartsController < ApplicationController 2 3 def add_item 4 5 if @cartitem.blank? 6 #カートに同じ商品がない場合 7 #↓ ↓ ↓ ↓ ↓これだとエラーが発生する 8 @cartitem =Cartitem.new(cartitem_params) 9 current_user.cartitems.build(cartitem_params) 10 #↓ ↓ ↓ ↓ ↓これだとエラーが発生せずレコードは作成されるが、数量・商品IDが保存されない 11 @cartitem =Cartitem.new#(cartitem_params) 12 @cartitem.save 13 current_user.cartitems.build 14 @item =Item.find_by(id: @cartItem.id) 15 redirect_to :cart_path, success:"#{@item.itemName}がカートに追加されました" 16 else 17 #カートに同じ商品がある場合 18 @cartitem.quantity += params[:quantity].to_i 19 @cartitem.save 20 @item =Item.find_by(id: @cartItem.id) 21 redirect_to :cart_path, success:"#{@item.itemName}がカートに追加されました" 22 end 23 end 24 25 private 26 def set_cartitems 27 # @cartitem = Cartitem.new 28 @cartitem = current_user.cartitems.find_by(item_id: params[:item_id]) 29 binding.pry 30 end 31 32 def cartitem_params 33 #ここの部分でエラーが発生する? 34 params.require(:cartitem).permit(:quantity, :item_id, :user_id) 35 end 36end

app/controllers/items_controller.rb

ruby

1class ItemsController < ApplicationController 2 def preview 3 @item = Item.find(params[:id]) 4 end 5end

app/views/items/preview.html.erb

ruby

1. 2<%= form_tag("/add_item", method: "post") do %> 3 <%= text_field_tag :quantity %> 4 <%= hidden_field_tag :item_id, @item.id %> 5 <%= submit_tag("カートに入れる") %> 6<% end %> 7.

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

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

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

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

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

guest

回答1

0

自己解決

すいません。完全に勘違いでした。
Viewの部分でform_tagを使用しているにも関わらずcontrollerの部分ではparams.require(:cartitem).permit(:quantity, :item_id, :user_id)
記述し、form_forのストロングパラメーターを利用していました。
ただしくは
params.permit(:quantity, :item_id, :user_id)
でした。

投稿2018/05/11 18:16

begenner

総合スコア79

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問