我有一个button_to,通过Ajax将一个对象(在本例中为Image)添加到Cart中,一旦添加,我想更改button_to以便能够从Cart中删除该特定图像。我已经实现了一些有用的东西(你必须刷新页面才能显示“从购物车中移除”按钮,但是当删除按钮时会发生变化)。
我目前的尝试与我有关,我知道它可以更清洁,我认为逻辑/方法可能不正确,我认为数据库查询可能更好,特别是因为它们在视图中。我想知道如何正确地解决这个问题
查看(图像/显示)
<div id="cart_button">
<%= render 'shared/cart_button', locals: { image_id: @image } %>
</div>
共享/ cart_button
<% if Cart.where(user_id: current_user, image_id: @image).count == 0 %>
<%=button_to carts_path(image_id: params[:id], user_id: current_user.id), method: :post, :remote => true,do %>
Add To Cart
<% end %>
<% elsif Cart.where(user_id: current_user, image_id: @image).count == 1 %>
<%=button_to cart_path(id: Cart.where(user_id: current_user, image_id: @image).first.id), method: :delete, :remote => true, do %>
Remove From Cart
<% end %>
<% end %>
create.js.erb
$("#cart_button").html('<%= j render partial: "shared/cart_button" %>');
destroy.js.erb
$("#cart_button").html('<%= j render partial: "shared/cart_button" %>');
所以我现在遇到的问题是当我添加到购物车时按钮没有改变,但是当我刷新页面时按钮会改变。从购物车中取出按钮会更新
答案 0 :(得分:1)
<% if Cart.where(user_id: current_user, image_id: @image).count == 0 %>
这非常糟糕,你不应该在视图中有逻辑。
您需要解决的问题是创建两个模板,每个按钮一个。当您将产品添加到购物车时,渲染替换&#34;添加到购物车&#34;按钮&#34;从购物车中移除&#34;。当您点击&#34;从购物车中移除&#34;按钮,从购物车中删除产品并呈现替换&#34;从购物车中移除的模板&#34;按钮用&#34;添加到购物车&#34;按钮。
所以,流程看起来像这样:
create
操作中)呈现create.js.erb
模板,用&#34;从购物车中移除&#34;替换按钮按钮。destroy
操作发送一个请求,该请求会从购物车中移除产品并使用JS替换destroy.js.erb
,将按钮替换为&#34;添加到购物车&#34;。