gpt4 book ai didi

ruby-on-rails - 购物车,可以使用 Devise 的 session 功能吗?

转载 作者:行者123 更新时间:2023-12-04 06:30:35 25 4
gpt4 key购买 nike

我正在编写一个电子商务网站,我需要实现购物车功能。我希望客户无需事先注册就可以将产品添加到他们的购物车中,所以我想我可以通过 session 来实现这一点。

这可以在 Devise gem 中完成还是我必须实现我自己的 session 模型才能使其工作?

最佳答案

您需要处理自己的 session 数据 - 并不意味着您需要 session model尽管。
我们已经实现了你正在寻找的东西。它使用 session 模型工作,但使用我为您推荐的相同基本功能:

#app/models/cart_session.rb
class CartSession

#Initalize Cart Session
def initialize(session)
@session = session
@session[:cart] ||= {}
end

#Cart Count
def cart_count
if (@session[:cart][:products] && @session[:cart][:products] != {})
@session[:cart][:products].count
else
0
end
end

#Cart Contents
def cart_contents
products = @session[:cart][:products]

if (products && products != {})

#Determine Quantities
quantities = Hash[products.uniq.map {|i| [i, products.count(i)]}]

#Get products from DB
products_array = Product.find(products.uniq)

#Create Qty Array
products_new = {}
products_array.each{
|a| products_new[a] = {"qty" => quantities[a.id.to_s]}
}

#Output appended
return products_new

end

end

#Qty & Price Count
def subtotal
products = cart_contents

#Get subtotal of the cart items
subtotal = 0
unless products.blank?
products.each do |a|
subtotal += (a[0]["price"].to_f * a[1]["qty"].to_f)
end
end

return subtotal

end

#Build Hash For ActiveMerchant
def build_order

#Take cart objects & add them to items hash
products = cart_contents

@order = []
products.each do |product|
@order << {name: product[0].name, quantity: product[1]["qty"], amount: (product[0].price * 100).to_i }
end

return @order
end

#Build JSON Requests
def build_json
session = @session[:cart][:products]
json = {:subtotal => self.subtotal.to_f.round(2), :qty => self.cart_count, :items => Hash[session.uniq.map {|i| [i, session.count(i)]}]}
return json
end


end

session
根据 Rails documentation :

Most applications need to keep track of certain state of a particularuser. This could be the contents of a shopping basket or the user idof the currently logged in user. Without the idea of sessions, theuser would have to identify, and probably authenticate, on everyrequest. Rails will create a new session automatically if a new useraccesses the application. It will load an existing session if the userhas already used the application.


据我所知, session 是为每个用户存储数据的小型 cookie 文件。这些是不明确的(为每个用户创建 - 无论他们是否登录),这意味着我会将它们用于您的购物车
我们使用 Sessions通过存储原始数据来创建购物车数据 id session 中购物车产品的

设计
关于设计的说明 - 您要问的与设计 gem 无关。 Devise 是一个身份验证系统,这意味着它会处理用户是否有权访问您的应用程序;它不处理购物车数据
虽然 Devise 将数据存储在 sessions ,您需要定义自己的 session您购物车的数据。我们使用 cart 来做到这一点具有上述型号代码的 Controller :
#config/routes.rb
get 'cart' => 'cart#index', :as => 'cart_index'
post 'cart/add/:id' => 'cart#add', :as => 'cart_add'
delete 'cart/remove(/:id(/:all))' => 'cart#delete', :as => 'cart_delete'

#app/controllers/cart_controller.rb
class CartController < ApplicationController
include ApplicationHelper

#Index
def index
@items = cart_session.cart_contents
@shipping = Shipping.all
end

#Add
def add
session[:cart] ||={}
products = session[:cart][:products]

#If exists, add new, else create new variable
if (products && products != {})
session[:cart][:products] << params[:id]
else
session[:cart][:products] = Array(params[:id])
end

#Handle the request
respond_to do |format|
format.json { render json: cart_session.build_json }
format.html { redirect_to cart_index_path }
end
end

#Delete
def delete
session[:cart] ||={}
products = session[:cart][:products]
id = params[:id]
all = params[:all]

#Is ID present?
unless id.blank?
unless all.blank?
products.delete(params['id'])
else
products.delete_at(products.index(id) || products.length)
end
else
products.delete
end

#Handle the request
respond_to do |format|
format.json { render json: cart_session.build_json }
format.html { redirect_to cart_index_path }
end
end

end

关于ruby-on-rails - 购物车,可以使用 Devise 的 session 功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23154206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com