在Rails 4中更新Cart时更改button_to

时间:2015-12-28 13:47:42

标签: ruby-on-rails ruby ajax ruby-on-rails-4

我有一个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" %>');

所以我现在遇到的问题是当我添加到购物车时按钮没有改变,但是当我刷新页面时按钮会改变。从购物车中取出按钮会更新

1 个答案:

答案 0 :(得分:1)

<% if Cart.where(user_id: current_user, image_id: @image).count == 0 %>

这非常糟糕,你不应该在视图中有逻辑。

您需要解决的问题是创建两个模板,每个按钮一个。当您将产品添加到购物车时,渲染替换&#34;添加到购物车&#34;按钮&#34;从购物车中移除&#34;。当您点击&#34;从购物车中移除&#34;按钮,从购物车中删除产品并呈现替换&#34;从购物车中移除的模板&#34;按钮用&#34;添加到购物车&#34;按钮。

所以,流程看起来像这样:

  1. 渲染&#34;加入购物车&#34;按钮。
  2. 单击按钮时,将发送一个请求,并将产品添加到数据库中的购物车。
  3. 响应(在create操作中)呈现create.js.erb模板,用&#34;从购物车中移除&#34;替换按钮按钮。
  4. 当&#34;从购物车中删除&#34;单击按钮,会向destroy操作发送一个请求,该请求会从购物车中移除产品并使用JS替换destroy.js.erb,将按钮替换为&#34;添加到购物车&#34;。