[英]adding more than one item to a cart using redis and rails
I've been following this guide on how to create a shopping cart using Rails, Redis, and the Braintree API. 我一直在遵循本指南,了解如何使用Rails,Redis和Braintree API创建购物车。 http://www.sitepoint.com/build-online-store-rails/ http://www.sitepoint.com/build-online-store-rails/
The guide teaches how to add a single movie to the shopping cart, and once you add that movie to the cart, the only available option is to remove it from the cart. 该指南介绍了如何将单个电影添加到购物车,并将该电影添加到购物车后,唯一可用的选项是将其从购物车中删除。 I am trying to make it such that I can add multiply copies of the same movie within the cart. 我正在尝试使其能够在购物车中添加同一电影的多个副本。 How do I accomplish this goal? 我如何实现这个目标?
As oppose to movies, I have panels. 与电影相反,我有面板。 The model, view, and controller are given below 模型,视图和控制器如下所示
panels.rb
class Panel < ActiveRecord::Base
has_many :purchases
has_many :buyers, through: :purchases
def cart_action(current_user_id)
if $redis.sismember "cart#{current_user_id}", id
"Remove from"
else
"Add to"
end
end
end
panels_controller.rb
class PanelsController < ApplicationController
before_action :logged_in_user
before_action :set_panel, only: [:show, :edit, :update, :destroy]
# GET /panels
# GET /panels.json
def index
@panels = Panel.all
end
def show
@panel = Panel.find(params[:id])
@cart_action = @panel.cart_action current_user.try :id
end
panels/show.html.erb
<p id="notice"><%= notice %></p>
<p>
<strong>Title:</strong>
<%= @panel.title %>
</p>
<p>
<strong>Location:</strong>
<%= @panel.location %>
</p>
<p>
<strong>Price:</strong>
<%= @panel.price %>
</p>
<%=link_to "", class: "btn btn-danger", data: {target: @cart_action, addUrl: add_to_cart_path(@panel), removeUrl: remove_from_cart_path(@panel)} do%>
<i class="fa fa-shopping-cart"></i>
<span><%=@cart_action%></span> Cart
<%end%>
panels.js.coffee
$(window).load ->
$('a[data-target]').click (e) ->
e.preventDefault()
$this = $(this)
if $this.data('target') == 'Add to'
url = $this.data('addurl')
new_target = "Remove from"
else
url = $this.data('removeurl')
new_target = "Add to"
$.ajax url: url, type: 'put', success: (data) ->
$('.cart-count').html(data)
$this.find('span').html(new_target)
$this.data('target', new_target)
As I've only gotten into redis since the beginning of this guide, Any help would would greatly appreciated! 自从本指南开始以来,我才刚接触过Redis,因此不胜感激!
One way I found to accomplish this was to add the panel ids to a hash instead, where the key is the panel id and the qty is the value: 我发现完成此操作的一种方法是将面板ID添加到哈希中,其中键是面板ID,数量是值:
{ panel_id => qty }
$redis.hmset current_user_cart, panel, item_qty
This will add the key=>value pair under the current_user_cart key, to retrieve the panel id's you can use hkeys , which will retrieve all the hash keys: 这将在current_user_cart键下添加key => value对,以检索面板ID,可以使用hkeys ,它将检索所有哈希键:
panel_ids = $redis.hkeys current_user_cart
Then to get the qtys you could call hgetall: 然后要获取数量,您可以致电hgetall:
@cart_qtys = $redis.hgetall current_user_cart
Which will return the complete hash, eg { panel_id => qty }, which you can then reference.(it should be noted that the qty's will be returned as strings) 它将返回完整的哈希,例如{panel_id => qty},您可以随后引用该哈希。(应注意,数量将作为字符串返回)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.