railsで管理画面で作成した項目をユーザー画面で選択できるようにしたい

実現したいこと

イメージ説明

こちらの画面で管理画面で作成した保証を一つ選択し、cartに追加できるようにしたいと思っております。

管理画面はこちらにになります。
イメージ説明

発生している問題・分からないこと

[#<CartItem:0x00007f97dedd3da8
id: 13,
quantity: 2,
customer_id: 1,
product_id: 9,
created_at: Wed, 08 May 2024 02:07:53.655066000 UTC +00:00,
updated_at: Wed, 08 May 2024 02:07:53.655066000 UTC +00:00,
insurance_id: nil>]

insurance_idに作成した保証が入るようにしたいと思っております

該当のソースコード

DB

1 create_table "insurances", force: :cascade do |t| 2 t.string "name" 3 t.integer "price" 4 t.text "description" 5 t.datetime "created_at", null: false 6 t.datetime "updated_at", null: false 7 end 8 9create_table "products", force: :cascade do |t| 10 t.string "name" 11 t.text "description" 12 t.integer "price" 13 t.integer "stock" 14 t.datetime "created_at", null: false 15 t.datetime "updated_at", null: false 16 t.bigint "store_id" 17 t.index ["store_id"], name: "index_products_on_store_id" 18 end

controller

1class Customer::CartItemsController < ApplicationController 2 # 顧客としてログインしているか 3 before_action :authenticate_customer! 4 before_action :set_cart_item, only: %i[increase decrease destroy] 5 6 def index 7 @cart_items = current_customer.cart_items # 現在ログインしている顧客のカート内商品を全て取得 8 @total = @cart_items.inject(0) { |sum, cart_item| sum + cart_item.line_total } 9 end 10 11 def create 12 increase_or_create(params[:cart_item][:product_id]) # カートへの商品追加 or カート内の商品の個数の更新 13 redirect_to cart_items_path, notice: "カートに追加されました" 14 end 15 16 def increase 17 @cart_item.increment!(:quantity, 1) # incrementメソッドの第一引数カラム名、第二引数に増加させる値 18 redirect_to request.referer, notice: "カート内を更新しました" # quantity カラムの変更後、元いた画面(カート内商品一覧画面)にリダイレクトさせる 19 end 20 21 def decrease 22 decrease_or_destroy(@cart_item) # カート内商品の個数を1減らす or カート内商品を削除する 23 redirect_to request.referer, notice: "カート内を更新しました" 24 end 25 26 def destroy 27 @cart_item.destroy 28 redirect_to request.referer, notice: "カート内商品を削除しました" 29 end 30 31 private 32 33 def set_cart_item 34 @cart_item = current_customer.cart_items.find(params[:id]) 35 end 36 37 def increase_or_create(product_id) 38 cart_item = current_customer.cart_items.find_by(product_id:) # 現在ログインしている顧客のカート内商品の中から顧客がカートに追加しようとしている商品を探している 39 if cart_item # carr_itemに何かしらの値が格納された場合 40 cart_item.increment!(:quantity, 1) # すでにその商品がカートに追加されているということになるのでカート内商品の個数を増やすだけ 41 else # cart_itemがnilの場合 42 current_customer.cart_items.build(product_id:).save # 商品は初めてカートに追加されるのでCartItemを新たに作成 43 end 44 end 45 46 def decrease_or_destroy(cart_item) 47 if cart_item.quantity > 1 # カート内商品は1以上であるか 48 cart_item.decrement!(:quantity, 1) # 1以上であればカート内商品の個数を1減らす 49 else 50 cart_item.destroy # 1より小さい場合はカート内商品を削除する 51 end 52 end 53end 54 55class Customer::ProductsController < ApplicationController 56 def index 57 @products, @sort = get_products(params) 58 end 59 60 def show 61 @product = Product.find(params[:id]) 62 # 商品をカートに追加できるように空のCartItemモデルを定義 63 @cart_item = CartItem.new 64 end 65 66 private 67 68 def get_products(params) 69 return Product.all, 'default' unless params[:latest] || params[:price_high_to_low] || params[:price_low_to_high] 70 71 return Product.latest, 'latest' if params[:latest] 72 73 return Product.price_high_to_low, 'price_high_to_low' if params[:price_high_to_low] 74 75 [Product.price_low_to_high, 'price_low_to_high'] if params[:price_low_to_high] 76 end 77end 78

model

1class CartItem < ApplicationRecord 2 belongs_to :customer 3 belongs_to :product 4 belongs_to :insurance, optional: true # 保証情報を関連付けるためのアソシエーション 5 6 def line_total 7 product.price * quantity # 商品の価格 × 個数 8 end 9end 10 11class Product < ApplicationRecord 12 belongs_to :store 13 # belongs_to :insurance 14 with_options presence: true do 15 validates :name 16 validates :description 17 validates :price 18 validates :stock 19 validates :image 20 end 21 has_one_attached :image 22 scope :price_high_to_low, -> { order(price: :desc) } 23 scope :price_low_to_high, -> { order(price: :asc) } 24 # destroy→顧客が削除された時に顧客に関連づけされている全てのカードアイテムも自動的に削除されます。 25 # customer.cart_itemsを使用することで特定の顧客に関連付けされている全てのカートアイテムを取得することができます 26 has_many :cart_items, dependent: :destroy 27end 28

view

1<div class="relative mx-auto max-w-screen-xl p-6"> 2 <div class="grid grid-cols-1 items-start gap-9 md:grid-cols-2"> 3 <div> 4 <%= image_tag @product.image, class: "aspect-square w-full rounded-xl object-contain" %> 5 </div> 6 <div class="sticky top-0"> 7 <div class="flex flex-col justify-between"> 8 <div class="flex justify-between mb-6"> 9 <div class="max-w-[35ch]"> 10 <h1 class="text-2xl font-bold"> 11 <%= @product.name %> 12 </h1> 13 </div> 14 <p class="text-2xl font-bold"><%= number_to_currency(@product.price, unit: "¥", strip_insignificant_zeros: true) %></p> 15 </div> 16 <div class="mb-3"> 17 <p> 18 <%= @product.description %> 19 </p> 20 </div> 21 <div class="mb-3"> 22 <p> 23 <%= @product.store.name %> 24 </p> 25 </div> 26 <div class="mb-3"> 27 <p> 28 <%= @product.store.description %> 29 </p> 30 </div> 31 32 <!-- ここに保証の選択肢を表示 --> 33 34 <% if @product.stock > 0 %> 35 <%= form_with model: @cart_item, data: { turbo: false } do |f| %> 36 <%= f.hidden_field :product_id, :value => @product.id %> 37 <%= f.submit "Add to Cart", class:"w-full cursor-pointer focus:outline-none text-white bg-green-700 hover:bg-green-800 focus:ring-4 focus:ring-green-300 font-medium rounded-lg text-sm px-5 py-2.5 mr-2 mb-2" %> 38 <% end %> 39 <% end %> 40 </div> 41 </div> 42 </div> 43</div> 44

試したこと・調べたこと

上記の詳細・結果

色々試してみたのですが、insurance_idがnilばかりになってしまいます..

補足

特になし

コメントを投稿

0 コメント