I am running some issue here, i built a simple marketplace but when it comes to add a product in a cart, a line_item (representing a product by the ID) should be added to the cart. Instead no line_item is created and i have this error popping up.
I checked the relation between models, did the routes again, checked the views and forms. If i use @line_item.save instead of @line_item.save. i can see my cart view but no line_item has been created...
What am i missing here? Thanks
create_table "line_items", force: :cascade do |t|
t.integer "quantity"
t.integer "product_id"
t.integer "cart_id"
t.integer "order_id"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
class LineItem < ApplicationRecord
belongs_to :product
belongs_to :cart
belongs_to :order, optional: true
def total_price
self.quantity * self.product.price
end
end
class LineItemsController < ApplicationController
def create
# Find associated product and current cart
chosen_product = Product.find(params[:product_id])
current_cart = @current_cart
# If cart already has this product then find the relevant line_item and iterate quantity otherwise create a new line_item for this product
if current_cart.products.include?(chosen_product)
# Find the line_item with the chosen_product
@line_item = current_cart.line_items.find_by(product_id: chosen_product)
# Iterate the line_item's quantity by one
@line_item.quantity += 1
else
@line_item = LineItem.new
@line_item.cart = current_cart
@line_item.product = chosen_product
end
# Save and redirect to cart show path
@line_item.save!
redirect_to cart_path(current_cart)
end
def add_quantity
@line_item = LineItem.find(params[:id])
@line_item.quantity += 1
@line_item.save
redirect_to cart_path(@current_cart)
end
def reduce_quantity
@line_item = LineItem.find(params[:id])
if @line_item.quantity > 1
@line_item.quantity -= 1
end
@line_item.save
redirect_to cart_path(@current_cart)
end
def destroy
@line_item = LineItem.find(params[:id])
@line_item.destroy
redirect_to cart_path(@current_cart)
end
private
def line_item_params
params.require(:line_item).permit(:quantity,:product_id, :cart_id)
end
end
Rails.application.routes.draw do
devise_for :users
root 'products#index'
get 'carts/:id' => "carts#show", as: "cart"
delete 'carts/:id' => "carts#destroy"
post 'line_items/:id/add' => "line_items#add_quantity", as: "line_item_add"
post 'line_items/:id/reduce' => "line_items#reduce_quantity", as: "line_item_reduce"
post 'line_items' => "line_items#create"
get 'line_items/:id' => "line_items#show", as: "line_item"
delete 'line_items/:id' => "line_items#destroy"
resources :products
resources :orders
end
Your quantity
is nil, that's why you get the error. Maybe add a default value for it in the migration like so:
t.quantity, type: :integer, default: 0
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.