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. 產(chǎn)生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. 顯示購物車內(nèi)物品數(shù)量

修改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>數(shù)量</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("確認結(jié)賬", "#", 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"

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末市框,一起剝皮案震驚了整個濱河市丐重,隨后出現(xiàn)的幾起案子腊状,更是在濱河造成了極大的恐慌纳本,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件土思,死亡現(xiàn)場離奇詭異务热,居然都是意外死亡,警方通過查閱死者的電腦和手機己儒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門崎岂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闪湾,你說我怎么就攤上這事冲甘。” “怎么了途样?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵江醇,是天一觀的道長。 經(jīng)常有香客問我何暇,道長陶夜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任裆站,我火速辦了婚禮条辟,結(jié)果婚禮上黔夭,老公的妹妹穿的比我還像新娘。我一直安慰自己捂贿,他們只是感情好纠修,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厂僧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪了牛。 梳的紋絲不亂的頭發(fā)上颜屠,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音鹰祸,去河邊找鬼甫窟。 笑死,一個胖子當(dāng)著我的面吹牛蛙婴,可吹牛的內(nèi)容都是我干的粗井。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼街图,長吁一口氣:“原來是場噩夢啊……” “哼浇衬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起餐济,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤耘擂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后絮姆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體醉冤,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年篙悯,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚁阳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸽照,死狀恐怖螺捐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情移宅,我是刑警寧澤归粉,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站漏峰,受9級特大地震影響糠悼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浅乔,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一倔喂、第九天 我趴在偏房一處隱蔽的房頂上張望铝条。 院中可真熱鬧,春花似錦席噩、人聲如沸班缰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽埠忘。三九已至,卻和暖如春馒索,著一層夾襖步出監(jiān)牢的瞬間莹妒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工绰上, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旨怠,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓蜈块,卻偏偏與公主長得像鉴腻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子百揭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容