Railaでカート機能で保存できない
解決したいこと
railsでカート機能で
カートに商品を保存できません。
発生している問題
carts_controllerの
カートに商品を追加する機能を
別のコントローラーである
products_controllerのshowページで
form_withを使って実装しようとしましたが
saveされません。
該当するソースコード
class CartsController < ApplicationController
before_action :setup_cart_item!, only:[:create]
def show
@cart_items = current_cart.cart_item.includes([:product])
@total = @cart_items.inject(0) { |sum, item| sum + item.sum_of_price }
end
def create
if @cart_item.blank?
@cart_item = current_cart.cart_items.build(product_id: params[:product_id])
end
@cart_item.quantity += params[:quantity].to_i
@cart_item.save
redirect_to root_path
end
private
def setup_cart_item!
@cart_item = current_cart.cart_items.find_by(product_id: params[:product_id])
end
end
module CartsHelper
def current_cart
if current_user
@current_cart = current_user.cart || current_user.create_cart
else
@current_cart = Cart.find(session[:cart_id]) || Cart.create
session[:cart_id] ||= @current_cart.id
end
end
end
class Cart < ApplicationRecord
has_many :cart_items, dependent: :destroy
end
class CartItem < ApplicationRecord
belongs_to :product
belongs_to :cart
def sum_of_price
product.price * quantity
end
end
class Product < ApplicationRecord
mount_uploaders :images, ProductUploader
validates :images, presence: true
validates :introduction, presence: true, length: { maximum: 500 }
validates :name, presence: true, uniqueness: true, length: { maximum: 100 }
validates :price, presence: true, numericality: { greater_than_or_equal_to: 1, less_than_or_equal_to: 10000 }
default_scope -> { order(created_at: :desc) }
end
<%= provide(:title, "商品詳細") %>
<div class="sp-page">
<div class="product_show">
<div class="product_show-detail">
<div class="product_show-name">
<%= @product.name%>
</div>
<div class="product_show-price">
<%= @product.price %>円/匹 (税込)
</div>
<div class="product_show-slide">
<% @product.images.each do |img| %>
<%= image_tag img.to_s, class:"product_show-img" %>
<% end %>
</div>
<div class="product_show-introduction">
<%= simple_format(@product.introduction) %>
</div>
<div class="product_show-cart">
<div class="product_cart-price">
<%= @product.price %>円/匹 (税込)
</div>
<%= form_with(model: @cart, local: true, url: add_item_url, method: :post) do |f| %>
<%= f.label :数量 %>
<%= f.select :quantity, [*1..50] %>
<%= f.submit "カートへ追加", class:"product_show-btn"%>
<% end %>
</div>
</div>
</div>
<div class="link-tab">
<div class="link">
<%= link_to "TOPへ戻る", '/' %>
</div>
<div class="link">
<%= link_to "商品一覧へ戻る", '/products' %>
</div>
</div>
</div>
class ProductsController < ApplicationController
before_action :admin_user, only:[:new, :create, :update, :destroy]
def new
@product = Product.new
end
def create
@product = Product.new(product_params)
if @product.save
flash[:notice] = "商品を登録しました"
redirect_to products_path
else
render 'new'
end
end
def index
@products = Product.all
end
def show
@product = Product.find(params[:id])
@cart = current_cart
end
def update
end
def destroy
end
private
def product_params
params.require(:product).permit(:name, :price, :introduction, {images: []})
end
end
###試したこと
createアクションで
def create
if @cart_item.blank?
@cart_item = current_cart.cart_items.build(product_id: 1)
end
@cart_item.quantity += params[:quantity].to_i
@cart_item.save
redirect_to root_path
end
product_idを固定すると保存される
product_idの取得の仕方に問題があるのではないかと勝手に想像しています。
解決方法を教えてください、よろしくお願いします。