JDStore——加入购物车

STEP 1

1. 加入app/views/products/show.html.erb
<%= link_to("加入购物车", add_to_cart_product_path(@product), :method => :post, :class => "btn btn-primary btn-lg btn-danger") =>
2. 加入app/controller/products_controller.rb
 def add_to_cart
     @product = Product.find(params[:id])
     redirect_to :back
     flash[:notice] = "测试加入购物车"
 end 
3. 修改config/routes.rb
  root 'product#index'
  devise_for :users
      namespace :admin do
          resources :products 
      end 
   -resources :products
   + resources :products do 
   + member do 
   +     post :add_to_cart
   +   end
   +end
end

git add .
git commit -m "add add_to_cart button"

STEP 2

1. 产生cart与cartitem两个model

rails g model cart
rails g model cart_item

2. 修改cartitem的migration
+t.integer :cart_id
+t.integer :product_id
+t.integer :quantity, default: 1

rake db:migrate

3. 修改app/models/cart.rb
+has_many :cart_items
+has_many :products, through: :cart_items ,source::product
4. 修改app/models/cart_item.rb
+belongs_to :cart
+belongs_to :product
5. 实作add_product_to_cart
app/models/cart.rb
+def add_product_to_cart(product)
   +ci = cart_items.build
   +ci.product = product
   +ci.quantity = 1
   +ci.save
+end
git add .
git commit -m "implement add_product_to_cart function"

STEP 3

1. 显示购物车内物品数量

修改app/views/common/_navbar.html.erb

<li>
    <%= link_to "#" do %>
        购物车  <i class="fa fa-shopping-cart"> </i> ( <%= current_cart.product.count %>
     <% end %>
</li>
2. 加入购物车代码

修改app/controllers/application_controller.rb

...略
  +     helper_method :current_cart
  +          def current_cart
  +                 @current_cart ||= find_cart
  +           end 
  +      private
  +          def find_cart
  +      cart = Cart.find_by(id: session[:cart_id])
               if cart.blank?
  +              cart = Cart.create
  +            end
  +       session[:cart_id] = cart.id
  +         return cart
  +      end
3. 加入current_cart.add_product_to_cart(@product)

修改app/controllers/products_controller.rb

  def add_to_cart
      @product = Product.find(params[:id])
  -     redirect_to  :back
  -     flash[:notice]  = "测试加入购物车"

  +    current_cart.add_product_to_cart(@product)
  +    flash[:notice] = "成功加入购物车"
  +    redirect_to  :back
end
git add .
git commit -m "implement current_cart function"

STEP 4显示购物车明细

1. 新增carts controller

rails g controller carts

2. 修改config/routes.rb
+resources :carts

修改app/views/common/_navbar.html.erb

<li>
  -   <%= link_to "#" do %>
  +  <%= link_to carts_path do %>
            购物车    <i class="fa fa-shopping-cart">   </i>  (  <%= current_cart.products.count %> )
        <% end %>
</li>
3. 实作购物明细

touch app/views/carts/index.html.erb

<div class="row">
  <div class="col-md-12">

    <h2> 购物车 </h2>

    <table class="table table-bordered">
      <thead>
        <tr>
          <th colspan="2">商品资讯</th>
          <th>单价</th>
          <th>数量</th>
        </tr>
      </thead>
      <tbody>

        <% current_cart.cart_items.each do |cart_item| %>
          <tr>
            <td>
              <%= link_to product_path(cart_item.product) do %>
                <% if cart_item.product.image.present? %>
                  <%= image_tag(cart_item.product.image.thumb.url, class: "thumbnail") %>
                <% else %>
                  <%= image_tag("http://placehold.it/200x200&text=No Pic", class: "thumbnail") %>
                <% end %>
              <% end %>
            </td>
            <td>
              <%= link_to(cart_item.product.title, product_path(cart_item.product)) %>
            </td>
            <td>
              <%= cart_item.product.price %>
            </td>
            <td>
              <%= cart_item.quantity %>
            </td>
          </tr>
        <% end %>

      </tbody>
    </table>

    <br>

    <div class="total clearfix">
      <span class="pull-right">
         <span> 总计 xxx RMB  </span>
      </span>
    </div>

    <hr>

    <div class="checkout clearfix">
      <%= link_to("确认结账", "#", method: :post, class: "btn btn-lg btn-danger pull-right") %>
    </div>
  </div>
</div>

git add .
git commit -m "implement carts index function"

STEP5 计算总价

1. 修改app/views/carts/index.html.erb
...(略)
    <div class="total clearfix">
      <span class="pull-right">
         <span>
          - 总计 xxx RMB
          + <% sum = 0 %>
          +   <% current_cart.cart_items.each do |cart_item| %>
          +    <% if cart_item.product.price.present? %>
          +      <% sum = sum + cart_item.quantity * cart_item.product.price %>
          +         <% end %>
          +     <% end %>
          +  总计 <%= sum %> RMB
         </span>
      </span>
    </div>
...(略)
2. Refactor到Helper去

修改app/views/carts/index.html.erb

   ...(略)
    <div class="total clearfix">
      <span class="pull-right">
        <span>
 -         <% sum = 0 %>
 -         <% current_cart.cart_items.each do |cart_item| %>
 -           <% if cart_item.product.price.present? %>
  -             <% sum = sum + cart_item.quantity * cart_item.product.price %>
  -           <% end %>
  -         <% end %>
  -         总计 <%= sum %> RMB
  +         总计 <%= render_cart_total_price(current_cart) %> RMB
        </span>
      </span>
    </div>
...(略)

修改app/helpers/carts_helper.rb

module CartsHelper
+  def render_cart_total_price(cart)
+    sum = 0
+    cart.cart_items.each do |cart_item|
+      if cart_item.product.price.present?
+        sum += cart_item.quantity * cart_item.product.price
+      end
+    end
+    sum
+  end
end
3.Refactor到Model去(如何做的更好)

修改app/helpers/cart_helper.rb

module CartsHelper
  def render_cart_total_price(cart)
-    sum = 0
-    cart.cart_items.each do |cart_item|
-      if cart_item.product.price.present?
-        sum += cart_item.quantity * cart_item.product.price
-      end
-    end
-    sum
+    cart.total_price
  end
end

修改app/model/cart.rb

class Cart < ApplicationRecord

  # ... 略

  
+  def total_price
+    sum = 0
+    cart_items.each do |cart_item|
+      if cart_item.product.price.present?
+        sum += cart_item.quantity * cart_item.product.price
+      end
+    end
+    sum
+  end
end

git add .
git commit -m "implement cart_total_price function"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容