質問編集履歴

3

コメント欄からの転載

2020/10/04 01:58

投稿

miitaka
miitaka

スコア2

test CHANGED
File without changes
test CHANGED
@@ -391,3 +391,259 @@
391
391
  長文で読みにくくて申し訳ありませんが、お力添えいただけると幸いです。
392
392
 
393
393
  アドバイスをよろしくお願い申し上げます。
394
+
395
+
396
+
397
+
398
+
399
+ ###10/4 11:00 追記
400
+
401
+ hatsu様にコメントをいただき、様々な箇所でbinding.pryを実行してみました。コメント欄では見辛かったので、本文に追記いたしました。
402
+
403
+ まず、current_cartのsession[:cart_id]と、Cartが存在するか確かめました。
404
+
405
+
406
+
407
+ ```
408
+
409
+ 8: def current_cart
410
+
411
+ => 9: binding.pry
412
+
413
+ 10: if session[:cart_id]
414
+
415
+ 11: @cart = Cart.find_by(id: session[:cart_id])
416
+
417
+ 12: else
418
+
419
+ 13: @cart = Cart.create(user_id: current_user.id)
420
+
421
+ 14: session[:cart_id] = @cart.id
422
+
423
+ 15: @cart = Cart.find_by(id: session[:cart_id])
424
+
425
+ 16: @cart
426
+
427
+ 17: end
428
+
429
+ 18: end
430
+
431
+
432
+
433
+ [2] pry(#<CartsController>)> session[:cart_id]
434
+
435
+ => 13
436
+
437
+
438
+
439
+ [4] pry(#<CartsController>)> Cart.find_by(id: session[:cart_id])
440
+
441
+ Cart Load (0.5ms) SELECT `carts`.* FROM `carts` WHERE `carts`.`id` = 13 LIMIT 1
442
+
443
+ ↳ (pry):43:in `current_cart'
444
+
445
+ => #<Cart:0x00007fa1d1e9e1f0
446
+
447
+ id: 13,
448
+
449
+ user_id: 4,
450
+
451
+ ```
452
+
453
+ と、session[:cart_id]と、そのCartは存在するようです。
454
+
455
+
456
+
457
+ set_up_item!の直後にもbinding.pryを置いてみました
458
+
459
+ ```
460
+
461
+ 34: def setup_cart_item!
462
+
463
+ => 35: binding.pry
464
+
465
+ 36: @cart_item = current_cart.cart_items.find_by(item_id: params[:item_id])
466
+
467
+ 37: end
468
+
469
+
470
+
471
+ [1] pry(#<CartsController>)> current_cart
472
+
473
+ Cart Load (0.5ms) SELECT `carts`.* FROM `carts` WHERE `carts`.`id` = 13 LIMIT 1
474
+
475
+ ↳ app/controllers/application_controller.rb:10:in `current_cart'
476
+
477
+ => #<Cart:0x00007fa1d1a4db50
478
+
479
+ id: 13,
480
+
481
+ user_id: 4,
482
+
483
+ created_at: Sun, 04 Oct 2020 00:26:44 JST +09:00,
484
+
485
+ updated_at: Sun, 04 Oct 2020 00:26:44 JST +09:00>
486
+
487
+
488
+
489
+ [3] pry(#<CartsController>)> cart_items
490
+
491
+ NameError: undefined local variable or method `cart_items' for #<CartsController:0x00007fa1d1886858>
492
+
493
+ Did you mean? cart_path
494
+
495
+ ```
496
+
497
+ こちらで、current_cartは取得できるようになっていることがわかりました。
498
+
499
+ しかし、[3] pry(#<CartsController>)> cart_items
500
+
501
+ では再び、 undefined local variable or method `cart_items' となり、cart_itemsが定義されていないと出てしまいます。
502
+
503
+ 同一の箇所にbinding.pryをかけ、質問を変えてみました
504
+
505
+ ```
506
+
507
+ 34: def setup_cart_item!
508
+
509
+ => 35: binding.pry
510
+
511
+ 36: @cart_item = current_cart.cart_items.find_by(item_id: params[:item_id])
512
+
513
+ 37: end
514
+
515
+
516
+
517
+ [1] pry(#<CartsController>)> current_cart.cart_items
518
+
519
+ Cart Load (0.6ms) SELECT `carts`.* FROM `carts` WHERE `carts`.`id` = 13 LIMIT 1
520
+
521
+ ↳ app/controllers/application_controller.rb:10:in `current_cart'
522
+
523
+ CartItem Load (0.4ms) SELECT `cart_items`.* FROM `cart_items` WHERE `cart_items`.`cart_id` = 13
524
+
525
+ ↳ app/controllers/carts_controller.rb:35:in `setup_cart_item!'
526
+
527
+ => [#<CartItem:0x00007fa1d1eccde8
528
+
529
+ id: 15,
530
+
531
+ quantity: 0,
532
+
533
+ item_id: 29,
534
+
535
+ cart_id: 13,
536
+
537
+ created_at: Sun, 04 Oct 2020 02:25:43 JST +09:00,
538
+
539
+ updated_at: Sun, 04 Oct 2020 02:25:43 JST +09:00>]
540
+
541
+
542
+
543
+ [2] pry(#<CartsController>)> current_cart.cart_items.find_by(item_id: params[:item_id])
544
+
545
+ CACHE Cart Load (0.0ms) SELECT `carts`.* FROM `carts` WHERE `carts`.`id` = 13 LIMIT 1 [["id", 13], ["LIMIT", 1]]
546
+
547
+ ↳ app/controllers/application_controller.rb:10:in `current_cart'
548
+
549
+ CartItem Load (0.5ms) SELECT `cart_items`.* FROM `cart_items` WHERE `cart_items`.`cart_id` = 13 AND `cart_items`.`item_id` IS NULL LIMIT 1
550
+
551
+ ↳ (pry):55:in `setup_cart_item!'
552
+
553
+ => nil
554
+
555
+ ```
556
+
557
+ [1] pry(#<CartsController>)> current_cart.cart_items
558
+
559
+ ではcart_itemsの中身も取得できているように見えるのですが、
560
+
561
+ [2] pry(#<CartsController>)> current_cart.cart_items.find_by(item_id: params[:item_id])
562
+
563
+ とすると、nilになってしまいます。
564
+
565
+
566
+
567
+ ```
568
+
569
+ def setup_cart_item!
570
+
571
+ @cart_item = current_cart.cart_items
572
+
573
+ end
574
+
575
+ ```
576
+
577
+ と.find_by(item_id: params[:item_id]を抜いてみた方が良いのでしょうか。
578
+
579
+
580
+
581
+ 試しに抜いてみて、add_itemメソッドの直下にbinding.pryを仕掛けますと、
582
+
583
+ ```
584
+
585
+ 10: def add_item
586
+
587
+ => 11: binding.pry
588
+
589
+ 12: if @cart_item.blank?
590
+
591
+ 13: @cart_item = current_cart.cart_items.build(item_id: params[:item_id])
592
+
593
+ 14: end
594
+
595
+ 15: @cart_item.save
596
+
597
+ 16: redirect_to current_cart
598
+
599
+ 17: end
600
+
601
+
602
+
603
+ [1] pry(#<CartsController>)> @cart_item
604
+
605
+ CartItem Load (0.5ms) SELECT `cart_items`.* FROM `cart_items` WHERE `cart_items`.`cart_id` = 13
606
+
607
+ ↳ app/controllers/carts_controller.rb:11:in `add_item'
608
+
609
+ => [#<CartItem:0x00007fa1d00d4548
610
+
611
+ id: 15,
612
+
613
+ quantity: 0,
614
+
615
+ item_id: 29,
616
+
617
+ cart_id: 13,
618
+
619
+ created_at: Sun, 04 Oct 2020 02:25:43 JST +09:00,
620
+
621
+ updated_at: Sun, 04 Oct 2020 02:25:43 JST +09:00>]
622
+
623
+ ```
624
+
625
+ となり、set_up_item!メソッドは実行できていると考えます。しかし、この際、
626
+
627
+ ```
628
+
629
+ NoMethodError in CartsController#add_item
630
+
631
+ undefined method `save' for #<CartItem::ActiveRecord_Associations_CollectionProxy:0x00007fa1eebacee8>
632
+
633
+ Extracted source (around line #16):
634
+
635
+ end
636
+
637
+ @cart_item.save
638
+
639
+ redirect_to current_cart
640
+
641
+ end
642
+
643
+
644
+
645
+ ```
646
+
647
+ saveできないようになってしまいます。saveメソッドが使えないということはどういうことなのでしょうか?ご回答いただけると幸いです。
648
+
649
+ お忙しいところ恐縮ですが、よろしくお願い申し上げます。

2

取り消し線をコメントアウトに修正

2020/10/04 01:58

投稿

miitaka
miitaka

スコア2

test CHANGED
File without changes
test CHANGED
@@ -224,7 +224,7 @@
224
224
 
225
225
  session[:cart_id] = @cart.id
226
226
 
227
- ~~@cart = Cart.find_by(session[:cart_id])~~
227
+ # @cart = Cart.find_by(session[:cart_id])
228
228
 
229
229
      @cart = Cart.find_by(id: session[:cart_id]) ★10/4 10:45 修正しました
230
230
 

1

current_cartメソッドの修正を行った

2020/10/04 01:49

投稿

miitaka
miitaka

スコア2

test CHANGED
File without changes
test CHANGED
@@ -224,7 +224,9 @@
224
224
 
225
225
  session[:cart_id] = @cart.id
226
226
 
227
- @cart = Cart.find_by(session[:cart_id])
227
+ ~~@cart = Cart.find_by(session[:cart_id])~~
228
+
229
+     @cart = Cart.find_by(id: session[:cart_id]) ★10/4 10:45 修正しました
228
230
 
229
231
  @cart
230
232