J'ai créé un site EC avec Ruby on Rails. À ce moment-là, j'ai passé beaucoup de temps à implémenter la fonction de panier, je vais donc décrire comment le faire.
Pour avoir la fonction de panier, une table est requise dans le DB. L'article suivant décrit l'association avec d'autres tables. [Rails] DB design of EC site
Ici, nous allons créer une session.
Pour les sessions, les articles suivants sont faciles à comprendre. [Rails] Comment utiliser Session
En bref, c'est un mécanisme qui conserve les données. J'ai donc codé la création de session pour ce panier comme suit.
# application_controller.rb
class ApplicationController < ActionController::Base
private
  #Créer une session
  def current_cart
    #Panier obtenu de la session_Obtenir des informations sur le panier à partir de la table Panier en fonction de l'ID
    current_cart = Cart.find_by(id: session[:cart_id])
    #Si les informations du panier n'existent pas@current_Créer un panier
    current_cart = Cart.create unless current_cart
    #Acquérir l'ID à partir des informations de panier acquises et le définir dans la session
    session[:cart_id] = current_cart.id
    #Informations sur le panier de retour
    current_cart
  end
end
Le "current_cart" défini ici sera également utilisé pour d'autres contrôleurs.
De là, nous utiliserons la méthode créée précédemment dans carts_controller.
class CartsController < ApplicationController
  before_action :set_line_item, only: [:add_item, :destroy]
  before_action :set_user
  before_action :set_cart
  def show
    @line_items = @cart.line_items
  end
  def add_item
    @line_item = @cart.line_items.build(product_id: params[:product_id]) if @line_item.blank?
    @line_item.quantity += params[:quantity].to_i
    if @line_item.save
      redirect_to current_cart
    else
      redirect_to controller: "products", action: "show"
    end
  end
  def destroy
    @cart.destroy
    redirect_to current_cart
  end
  private
  def set_user
    @user = current_user
  end
  def set_line_item
    @line_item = current_cart.line_items.find_by(product_id: params[:product_id])
  end
  def set_cart
    @cart = current_cart
  end
end
Concernant l'action add_item, un bouton "Ajouter au panier" est installé sur la page de détail du produit, et le produit est ajouté au panier en utilisant la méthode HTTP de POST.
@line_item = @cart.line_items.build(product_id: params[:product_id]) if @line_item.blank?
Ci-dessus, mais en utilisant la méthode de construction. Build est un alias pour new, mais il semble que lors de la création d'un objet du modèle qui lui est associé par convention, build est utilisé et new est utilisé autrement.
Cette fois, cart est le parent et line_item est l'enfant, nous avons donc utilisé build pour créer un objet pour le modèle line_item. (Excusez-moi si je me trompe)
Fondamentalement, je pense qu'il fonctionne jusqu'à présent comme un chariot.
Vous pouvez créer un site EC en quelques secondes en utilisant une gemme appelée solidus.
Article de référence ↓ Mémo d'installation de Solidus, le système EC successeur de Spree
J'ai essayé de l'utiliser, mais il semble que la personnalisation soit lente. Cela peut être une fourmi de l'essayer selon le but.
Recommended Posts