Я пытаюсь создать простое добавление в корзину с помощью Ruby on Rails, и у меня возникла проблема с отображением простой ссылки на корзину с последним идентификатором пользователя, который только что добавил элемент в корзину.Просто я получаю эту ошибку:
No route matches {:action=>"show", :controller=>"carts", :id=>nil}, missing required keys: [:id]
Это моя ссылка на корзину и место, где я получаю ошибку
<%= link_to 'Cart', cart_path(@cart), class: 'header__cart_link' %>
Маршруты выглядят так же, как и должно быть, яя называю это
resources :carts
На маршрутах консольного рейка
carts GET /carts(.:format) carts#index
POST /carts(.:format) carts#create
new_cart GET /carts/new(.:format) carts#new
edit_cart GET /carts/:id/edit(.:format) carts#edit
cart GET /carts/:id(.:format) carts#show
PATCH /carts/:id(.:format) carts#update
PUT /carts/:id(.:format) carts#update
DELETE /carts/:id(.:format) carts#destroy
Кроме того, я использую контроллер line_items для создания ссылки на корзину, чтобы установить отношение продукта икорзина в line_items
class CartsController < ApplicationController
before_action :set_cart, only: %i[show edit update destroy]
rescue_from ActiveRecord::RecordNotFound, with: :invalid_cart
load_and_authorize_resource
def index
@carts = Cart.all
end
def new
@cart = Cart.new
end
def create
@cart = Cart.new(cart_params)
respond_to do |format|
if @cart.save
format.html { redirect_to @cart, notice: 'Cart was successfully created.' }
format.json { render :show, status: :created, location: @cart }
else
format.html { render :new }
format.json { render json: @cart.errors, status: :unprocessable_entity }
end
end
end
def update
respond_to do |format|
if @cart.update(cart_params)
format.html { redirect_to @cart, notice: 'Cart was successfully updated.' }
format.json { render :show, status: :ok, location: @cart }
else
format.html { render :edit }
format.json { render json: @cart.errors, status: :unprocessable_entity }
end
end
end
def destroy
# @cart.destroy if @cart.id == session[:cart_id]
@cart.destroy
session[:cart_id] = nil
respond_to do |format|
format.html { redirect_to root_path, notice: 'Cart was successfully emptied.' }
format.json { head :no_content }
end
end
def empty_cart
if !@cart.nil?
redirect_to cart_path(@cart)
else
redirect_to cart_path(session[:cart_id])
end
end
private
def set_cart
@cart = Cart.find(params[:id])
end
def cart_params
params.fetch(:cart, {})
end
def invalid_cart
logger.error "Attempt to access invalid cart #{params[:id]}"
redirect_to root_path, notice: 'Invalid cart'
end
end
и здесь контроллер тележки сам
def create
@cart = Cart.new(cart_params)
respond_to do |format|
if @cart.save
format.html { redirect_to @cart, notice: 'Cart was successfully created.' }
format.json { render :show, status: :created, location: @cart }
else
format.html { render :new }
format.json { render json: @cart.errors, status: :unprocessable_entity }
end
end
end
В моем application_controller.rb я манипулирую set_cart
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
include CurrentCart
before_action :set_cart
# before_filter :configure_permitted_parameters, if: :devise_controller?
before_action :store_session_data
before_action :clean_session_cart
rescue_from CanCan::AccessDenied do |exception|
if user_signed_in?
redirect_to main_app.root_url, alert: exception.message
else
redirect_to new_user_session_path, alert: exception.message
end
end
protect_from_forgery
protected
def clean_session_cart
Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
session[:cart_id] = nil
end
def store_session_data
RequestStore.store[:session] = session
end
end
, а затем ясоздание concerns
в моделях current_cart.rb
module CurrentCart
extend ActiveSupport::Concern
private
def set_cart
begin
@cart = Cart.find(params[:cart_id] || session[:cart_id])
rescue ActiveRecord::RecordNotFound
@cart = Cart.create
end
session[:card_id] = @cart.id
end
end