回答編集履歴

4

typo修正

2020/09/06 23:23

投稿

winterboum
winterboum

スコア23360

test CHANGED
@@ -56,7 +56,7 @@
56
56
 
57
57
  Product のインスタンスは @product がよいです。@product_info とするとProductInfo という別のモデルのインスタンスであると思われます。
58
58
 
59
- @product_info は @product になおした、として
59
+ @product_info は @product になおした、として
60
60
 
61
61
  そうしますと `f.hidden_field :product_id, value: @product.id` により `params[:session][:product_id]` ができているのでそれを使いましょう。
62
62
 
@@ -70,7 +70,7 @@
70
70
 
71
71
  `form_for(@product, url: cart_items_path)`にして、`params[:product][:product_id]` が自然です。
72
72
 
73
- `@cart.cart_items.build(product_id: arams[:product][:product_id])` ですね。
73
+ `@cart.cart_items.build(product_id: params[:product][:product_id])` ですね。
74
74
 
75
75
  なお ` if @cart_item.blank?` は不要です。actionに入った直後なので必ず blankです。
76
76
 

3

追記

2020/09/06 23:23

投稿

winterboum
winterboum

スコア23360

test CHANGED
@@ -49,3 +49,37 @@
49
49
  で、ですね。
50
50
 
51
51
  欲しい値はsession[:product_id]とか@product_info.id とか書けば万能の召喚呪文の如くそこに現れるわけではないですよ。召喚する前に仕込んで置かなければ。
52
+
53
+
54
+
55
+ ### 追記2
56
+
57
+ Product のインスタンスは @product がよいです。@product_info とするとProductInfo という別のモデルのインスタンスであると思われます。
58
+
59
+ @product_info は @product になおした、として)
60
+
61
+ そうしますと `f.hidden_field :product_id, value: @product.id` により `params[:session][:product_id]` ができているのでそれを使いましょう。
62
+
63
+ 「該当商品のidをsession[:product_id]に入れました。」とありますが入れていないので。
64
+
65
+
66
+
67
+ ただ、
68
+
69
+ `form_for(:session, url: cart_items_path) ` のsession がいかにも不自然です。
70
+
71
+ `form_for(@product, url: cart_items_path)`にして、`params[:product][:product_id]` が自然です。
72
+
73
+ `@cart.cart_items.build(product_id: arams[:product][:product_id])` ですね。
74
+
75
+ なお ` if @cart_item.blank?` は不要です。actionに入った直後なので必ず blankです。
76
+
77
+
78
+
79
+ ###蛇足
80
+
81
+ sessionを使う必要があるのか? paramsでcart_idを渡せば済む。
82
+
83
+ そもそもuserが has_many :carts な必要があるのか? has_one :cart で十分では?
84
+
85
+ それならparamsで渡す必要もない。 `@cart = current_user.cart || Cart.create(user_id: current_user.id)`とか`@cart = cCart.find_or_create_by(user_id: current_user.id)`で済む

2

追記

2020/09/06 23:20

投稿

winterboum
winterboum

スコア23360

test CHANGED
@@ -25,3 +25,27 @@
25
25
  うまくいかなかった場合は、
26
26
 
27
27
  最新のcodeを載せ、**一時的に** `@cart_item.save!` と ! をつけて実行し画面に出たエラーを載せてください
28
+
29
+
30
+
31
+ #### 追記
32
+
33
+ 原因は明白、`@cart.cart_items.build` で product_id が渡されていないから。
34
+
35
+ はてな? が2つ。
36
+
37
+ 1. session[:product_id] ってどこで定義してます?
38
+
39
+ 1. f.hidden_field :product_id, value: @product_info.id とありますが、@product_info ?
40
+
41
+
42
+
43
+ products の show なので productが渡ってると思ったのですが違う?
44
+
45
+ show action載せてください。
46
+
47
+
48
+
49
+ で、ですね。
50
+
51
+ 欲しい値はsession[:product_id]とか@product_info.id とか書けば万能の召喚呪文の如くそこに現れるわけではないですよ。召喚する前に仕込んで置かなければ。

1

追記

2020/09/06 22:21

投稿

winterboum
winterboum

スコア23360

test CHANGED
@@ -19,3 +19,9 @@
19
19
  関連を直し、controllerを変えて、viewを直しましょう。
20
20
 
21
21
  products/show.html なのですから、productは分かってますよね?
22
+
23
+
24
+
25
+ うまくいかなかった場合は、
26
+
27
+ 最新のcodeを載せ、**一時的に** `@cart_item.save!` と ! をつけて実行し画面に出たエラーを載せてください