Witam.
W ramach nabywania doświadczenia, utworzyłem prosty sklep internetowy, którego część struktury wygląda następująco:
models
class User < ActiveRecord::Base
has_many :orders
end
class Order < ActiveRecord::Base
has_many :order_items
belongs_to :user
end
class OrderItem < ActiveRecord::Base
belongs_to :order
belongs_to :product
end
class Product < ActiveRecord::Base
has_many :order_items
end
sessions_helper.rb
module SessionsHelper
def log_in(user)
session[:user_id] = user.id
end
def current_user
@current_user ||= User.find_by(id: session[:user_id])
end
def log_out
session.delete(:user_id)
@current_user = nil
end
#...
sessions_controller.rb
class SessionsController < ApplicationController
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
load_order
redirect_back_or user
#...
def destroy
log_out
session[:order_id] = nil
redirect_to root_url
end
#...
application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
include SessionsHelper
def load_order
@order = Order.find_or_initialize_by_id(session[:order_id], user_id: session[:user_id])
if @order.new_record?
@order.save!
session[:order_id] = @order.id
end
end
end
order_items_controller.rb
class OrderItemsController < ApplicationController
before_action :load_order, only: [:create]
def create
@order_item = OrderItem.new(product_id: params[:product_id], order_id: @order.id)
respond_to do |format|
if @order_item.save
format.html { redirect_to @order, notice: 'Successfully added product to cart.' }
#...
Opiszę przykład działania aplikacji: użytkownik (id 1) dodaje “order item”, który wyświetla się w widoku orders/1. Po wylogowaniu się i powtórnym zalogowaniu, kolejne “order items” są dodawane do modelu Order o id 2 i są widoczne w orders/2. Reasumując, każde powtórne logowanie tworzy kolejną instancję modelu Order.
Dążę do tego, aby każdy użytkownik miał przypisany swój nr id do indywidualnego numeru zamówienia i po powtórnym zalogowaniu ponownie mógł dodawać produkty do tego samego “koszyka”, do którego miał dostęp przed wylogowaniem.
Próbowałem zastosować zmienną @current_user w metoddzie load_order, lecz wszystkie podejścia kończyły się errorem lub tym, że aplikacja nie działała w oczekiwany sposób.
Będę wdzięczny za pomoc w rozwiązaniu problemu.