2016-07-01 3 views
0

を破壊レンダリング私はカートを持っている/ show.html ERBそれは部分的と呼ばれるcarts_row.html.erb carts_rowでRailsの、後

<p id="notice"><%= notice %></p> 

</br> 
</br> 

<div class="cart-container"> 
    <%=render 'carts_row'%> 
</div> 




</p> 

をレンダリングすると、それは/数量を更新し、破壊するためにフォームでのショッピングカートのレイアウトですショッピングカートから商品を取り出してください。

<h1>Shopping Cart</h1> 

<div class="shopping-cart"> 
    <div class="column-labels"> 
    <label class="product-image">Image</label> 
    <label class="product-details">Product</label> 
    <label class="product-price">Price</label> 
    <label class="product-quantity">Quantity</label> 

    <!-- adding update column to labels --> 
    <label class="product-update">Update</label> 
    <label class="product-removal">Remove</label> 
    <label class="product-line-price">Total</label> 
    </div> 

    <%if @cart.cart_items.size == 0%> 
    <div class="text-center"> 
    <p>Looks like you have nothing in your cart! <%=link_to 'Add something to your cart', products_path%></p> 
    </div> 
    <%end%> 

    <br /> 
    <br /> 
    <%if @cart_items != nil%> 
    <%@cart_items.each do |item|%> 

    <div class="product"> 
     <div class="product-image"> 
     <%=image_tag(item.product.picture)%> 
     </div> 
     <div class="product-details"> 
     <div class="product-title"><%=item.product.name%></div> 
     <p class="product-description"><%=item.product.description%></p> 
     </div> 
     <div class="product-price"><%=number_to_currency(item.product.price)%></div> 

     <%=form_for item, remote: true do |f|%> 
     <div class="product-quantity"> 
     <%=f.number_field :quantity, value: item.quantity, min: 1, max: 8%> 
     <%=f.hidden_field :product_id, value: item.product.id%> 
     <!-- <input type="number" value="<%=item.quantity%>" min="1" max="8"> --> 
     </div> 
     <div class="product-update"> 
     <%=f.submit 'Update', class: "update-product"%> 
     <!-- <%=f.hidden_field :product_id, value: item.product.id%> --> 
     <!-- <button class="update-product"> 
      Update 
     </button> --> 
     </div> 
     <div class="product-removal"> 
     <%= link_to "Remove", item, {data: {confirm: "Are you sure you wish to delete the product '#{item.product.name}' from your cart?"}, method: :delete, remote: true, class: "remove-product"}%> 
     <!-- <button class="remove-product"> 
      Remove 
     </button> --> 
     <%end%> 
     </div> 
     <div class="product-line-price"><%=number_to_currency(item.product.price*item.quantity)%></div> 
    </div> 
    <%end%> 
    <%end%> 
<br /> 
<br /> 
<!--Temporary solution until model methods are written --> 
<% if @cart_items != nil%> 
    <!--subtotal variable --> 
    <%subtotal [email protected]_items.collect {|item| item.quantity*item.unit_price}.sum%> 
    <!--subtotal + shipping cost --> 
    <%total=subtotal+15%> 
<%end%> 
<div class="totals"> 
    <div class="totals-item"> 
    <label>Subtotal</label> 
    <div class="totals-value" id="cart-subtotal"><%=subtotal%></div> 
    </div> 
    <div class="totals-item"> 
    <label>Tax (5%)</label> 
    <div class="totals-value" id="cart-tax">Included!</div> 
    </div> 
    <div class="totals-item"> 
    <label>Shipping</label> 
    <div class="totals-value" id="cart-shipping">15.00</div> 
    </div> 
    <div class="totals-item totals-item-total"> 
    <label>Grand Total</label> 
    <div class="totals-value" id="cart-total"> 
     <%=total%> 
    </div></div> 
    </div> 
</div> 
<div class="checkout-btn"> 
    <button class="checkout">Checkout</button> 
</div> 
</div> 

形での更新は、フォームでこの

<% if @cart.errors.any? || @cart_item.errors.any? %> 
    alert("Not valid."); 
<%else%> 
    $(".cart-text").html("<%= escape_javascript(render 'layouts/cart_text')%>") 
    $(".cart-container").html("<%= escape_javascript(render 'carts/carts_row')%>") 
<%end%> 

を持っているupdate.js.erbそして破壊するために行くには、同じdestroy.js.erb

<% if @cart.errors.any? || @cart_item.errors.any? %> 
    alert("Not valid."); 
<%else%> 
    $(".cart-text").html("<%= escape_javascript(render 'layouts/cart_text')%>") 
    $(".cart-container").html("<%= escape_javascript(render 'carts/carts_row')%>") 
<%end%> 

ありupdateはcarts_row.html.erbフォームを適切にレンダリングします。 私はそれが空の製品と下部のチェックアウトの合計でページをレンダリングするアイテムを破壊した場合。ページを更新すると、ショッピングカート内の正しい量の商品が表示され、すべての場所に表示されます。

どのように正しい更新のレンダリングが、間違って破壊するのにレンダリングされます?

マイcarts_itemコントローラは、フォームのためにこれらの2つの方法があります

def update 
    @cart = current_cart 
    # finding cart_items by cart_id 
    @cart_item = @cart.cart_items.find(params[:id]) 
    # @cart_items.order(:id) 
    @cart_item.update_attributes(cart_item_params) 
    @cart_items = @cart.cart_items.order(:id) 
    # redirect 'cart_show_path' 
    end 

    def destroy 
    @cart = current_cart 
    @cart_item = @cart.cart_items.find(params[:id]) 
    @cart_item.destroy 
    @cart_items = @cart.cart_items 
    end 

答えて

0

私はこの問題を考え出しました。問題は、私は私の見解で<%場合@cart_items!= nilの%>チェックを使用していたということでした。 ActiveRecordのは、常に配列を返しますので、

これは、常に、falseを返します!!!!!!!!!! @cart_itemsオブジェクトに製品オブジェクトがあるかどうか。

@ cart_items.empty?で空の配列をテストするように変更した後、私が望んでいたようにページが機能しました。

ありがとうございました。

0

あなたはカートからアイテムを破壊するが、@cart.cart_items

から削除していないこの

def destroy 
    @cart = current_cart 
    @cart_item = @cart.cart_items.find(params[:id]) 

    #Find the index of @cart_item 
    item_index = @cart.cart_items.index(@cart_item) 

    #Remove it from @cart.cart_items when its destroyed successfully 
    if @cart_item.destroy 
    @cart.cart_items.delete_at(item_index) 
    end 

    @cart_items = @cart.cart_items 
end 
をやってみ

動作するかどうか教えてください!

+0

私は、@ cart.cart_items'が配列である 'と仮定しています。もしそうでないなら私に知らせて、 'current_cart'がすることを私に見せてください。 – Kumar

+0

Hmm。それは問題ではありません。 params [:id]で個々のcart_itemを探しているからです。 – powerup7

+0

試しましたか?のための? – Kumar

関連する問題