Javascript 使用redis和rails向购物车添加多个项目

Javascript 使用redis和rails向购物车添加多个项目,javascript,ruby-on-rails,coffeescript,redis,Javascript,Ruby On Rails,Coffeescript,Redis,我一直在遵循这个指南,了解如何使用Rails、Redis和BraintreeAPI创建购物车 本指南介绍如何将单个电影添加到购物车中,一旦将该电影添加到购物车中,唯一可用的选项就是将其从购物车中删除。我正在努力使它,使我可以添加同一部电影在购物车的多个副本。我如何实现这个目标 与电影相反,我有面板。模型、视图和控制器如下所示 panels.rb class Panel < ActiveRecord::Base has_many :purchases has_many :b

我一直在遵循这个指南,了解如何使用Rails、Redis和BraintreeAPI创建购物车

本指南介绍如何将单个电影添加到购物车中,一旦将该电影添加到购物车中,唯一可用的选项就是将其从购物车中删除。我正在努力使它,使我可以添加同一部电影在购物车的多个副本。我如何实现这个目标

与电影相反,我有面板。模型、视图和控制器如下所示

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)
panels.rb
类面板

标题:

位置:

价格:

运货马车 咖啡 $(窗口)。加载-> $('a[数据目标])。单击(e)-> e、 预防默认值() $this=$(this) 如果$this.data('target')=='Add to' url=$this.data('addurl')) 新建\u target=“从中删除” 其他的 url=$this.data('removeurl') 新建\u target=“添加到” $.ajaxURL:url,键入:“put”,成功:(数据)-> $('.cart count').html(数据) $this.find('span').html(新目标) $this.data('target',new_target)

由于我是从本指南开始才进入redis的,任何帮助都将不胜感激

我发现实现这一点的一种方法是将面板id添加到哈希中,其中键是面板id,数量是值:

{ panel_id => qty }
使用:

这将在当前用户购物车密钥下添加key=>value对,以检索您可以使用的面板id,该id将检索所有散列密钥:

panel_ids = $redis.hkeys current_user_cart
然后,要获取QTY,您可以致电hgetall:

@cart_qtys = $redis.hgetall current_user_cart
它将返回完整的散列,例如{panel_id=>qty},然后您可以引用该散列。(应该注意,qty将作为字符串返回)

@cart_qtys = $redis.hgetall current_user_cart