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

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

ただいまの
回答率

90.87%

  • Ruby on Rails 4

    2369questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 92

tshr

score 20

現在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

  #cartitemテーブル
  create_table "cartitems", force: :cascade do |t|
    t.integer  "quantity",   limit: 4
    t.integer  "item_id",    limit: 4
    t.integer  "user_id",    limit: 4
  end
  #商品テーブル
  create_table "items", force: :cascade do |t|
    t.string   "itemName",          limit: 255
    t.float    "price",             limit: 24
  end

config/routes.rb

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

app/controllers/carts_controller.rb

class CartsController < ApplicationController

  def add_item

    if @cartitem.blank?
    #カートに同じ商品がない場合
      #↓ ↓ ↓ ↓ ↓これだとエラーが発生する
      @cartitem =Cartitem.new(cartitem_params)
      current_user.cartitems.build(cartitem_params)
      #↓ ↓ ↓ ↓ ↓これだとエラーが発生せずレコードは作成されるが、数量・商品IDが保存されない
      @cartitem =Cartitem.new#(cartitem_params)
      @cartitem.save
      current_user.cartitems.build
      @item =Item.find_by(id: @cartItem.id)
      redirect_to :cart_path, success:"#{@item.itemName}がカートに追加されました"
    else
    #カートに同じ商品がある場合
      @cartitem.quantity += params[:quantity].to_i
      @cartitem.save
      @item =Item.find_by(id: @cartItem.id)
      redirect_to :cart_path, success:"#{@item.itemName}がカートに追加されました"
    end
  end

  private
  def set_cartitems
    # @cartitem = Cartitem.new
    @cartitem = current_user.cartitems.find_by(item_id: params[:item_id])
    binding.pry
  end

  def cartitem_params
    #ここの部分でエラーが発生する?
    params.require(:cartitem).permit(:quantity, :item_id, :user_id)
  end
end


app/controllers/items_controller.rb

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

app/views/items/preview.html.erb

.
<%= form_tag("/add_item", method: "post") do %>
  <%= text_field_tag :quantity %>
  <%= hidden_field_tag :item_id, @item.id %>
  <%= submit_tag("カートに入れる") %>
<% end %>
.
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.87%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Ruby on Rails 4

    2369questions

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