/ / Rails、破棄後にレンダリングする - ruby​​-on-rails、forms、render

Rails、破棄後にレンダリングする - ruby​​-on-rails、forms、render

私はcart / show.html erbを持っていて、それはcarts_row.html.erbと呼ばれる部分をレンダリングします

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

</br>
</br>

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




</p>

carts_rowでは、数量を更新してショッピングカートからアイテムを破棄/削除するフォームを備えたショッピングカートのレイアウトです。

    <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 =@cart_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>

フォームの更新は、これを持つupdate.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%>

そして、フォーム内の破壊は同じ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%>

このアップデートにより、carts_row.htmlがレンダリングされます。エルブフォームを正しく。 アイテムを破棄すると、そのページには空の商品が表示され、チェックアウトの合計は下部に表示されます。ページを更新すると、ショッピングカート内の正しい量の商品が表示され、すべての場所に表示されます。

更新のレンダリングは正しく行われますが、破棄のレンダリングはどのように正しく行われますか?

私の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

回答:

回答№1は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

それが動作するかどうか私に教えてください!


回答№2の場合は0

私は問題を理解した。問題は、私のビューで<%if @cart_items!= nil%>チェックを使用していたことでした。

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

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

あなたの入力に感謝クマール。