0

我正在尝试在 Rails 6 上开发一个购物车系统(用于实践电子商务项目)。

代码(解释):

我有一个带有类属性“add_to_cart_link”的链接,然后我使用 jquery 选择具有提到的类的元素并在它们上设置一个点击监听器。点击监听器发送一个ajax请求到'shopping_experience/add_to_cart'。然后控制移动到shoppingExperience控制器内的“add_to_cart”方法。

问题是即使执行了 add_to_cart 方法,它也不会更新我的会话哈希,除非我使用“binding.pry”(这是用于调试的 pry gem 的一个功能)。在撬期间,每当检查散列(会话散列)的状态时,它总是它假设的状态,并且当我将一些东西添加到购物车时发生变化。

这是我的视图模板(index.html.erb):

<p id="notice"><%= notice %></p>
<%= link_to 'view cart', display_cart_path %>
<h1>Items</h1>
<table>
<thead>
<tr>
  <th>Name</th>
  <th>Price</th>
  <th>Quantity</th>
  <th>Category</th>
  <th colspan="3"></th>
</tr>
</thead>

 <tbody>
  <% @items.each do |item| %>
    <tr>
      <td><%= item.name %></td>
       <td><%= item.price %></td>
    <td><%= item.quantity %></td>
    <td><%= item.category.title %></td>


    <td><%= link_to 'Show', item %></td>
    <td> <a class="add_to_cart_link"   data-item_id=<%=item.id %> href="#"> add to cart button</a> 
    </td>
    <td><%= link_to 'Edit', edit_item_path(item) %></td>
    <td><%= link_to 'Destroy', item, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>


这是我的自定义(myjs.js.erb)

$( document ).ready(function() {
  $(document).on('click', 'a.add_to_cart_link', function() {
    console.log(this);
    console.log($('meta[name="csrf-token"]').attr('content'));
    var id = $(this).attr("data-item_id")
    console.log(id)
    $.ajax({
        method: "POST",
        headers: {'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')},
         url: 'shopping_experience/add_to_cart',
         data: { item_id: id },     
    })
  });
});

add_to 购物车方法:

def add_to_cart
  if !session[:current_cart] 
    session[:current_cart] =  {:shex_id => session[:current_cart_id] } 
  end

  #checks if session hash's current cart key doesn't have params[:item_id] key, value pair 
  if  !session[:current_cart].key?(params[:item_id]) 
    # set {units: 1}  as params[item_id] key's  value 

    session[:current_cart][params[:item_id]] = {}
    session[:current_cart][params[:item_id]][:quantity] = 1  
  else
    #else  increment  value  of  quantity

    session[:current_cart][params[:item_id]]["quantity"] = session[:current_cart][params[:item_id]]["quantity"] + 1
    #ShexItem.create(item_id: params[:item_id], shopping_experience_id: session[:current_cart_id] ) 
  end

  binding.pry

  puts(' at to cart method end')
end

因此,如果从末尾删除 bindin.pry,我的会话根本没有更改,并且我确实在终端中收到“在添加到购物车方法结束时”消息(即使我删除了 binding.pry)。这意味着确实调用了 add to card 方法,但我的会话没有得到更新,如果使用 pry 来调试有什么问题,它就会开始工作。我觉得它可能与使用 ajax 请求有关,因为会话可能没有得到更新或刷新。我真的在为此苦苦挣扎,有人可以帮忙吗?

这是 github 回购:https ://github.com/HaroonAzhar/ship-shop (我认为回购是公开的),

如果有人想更多地查找代码。

4

1 回答 1

0

所以我让它工作。在“at to cart method”消息之后,我在终端上看到了一行,上面写着:

"No template found for ShoppingExperiencesController#add_to_cart, rendering head :no_content". 

所以我真的不知道 head :no_content 是什么,但我认为它可能会取消/保存我的方法对会话所做的更改。所以在 add_to_cart 方法结束时,我重定向到索引页面

redirect_to  '/' 

仍然不确定为什么没有找到模板撤消我对哈希的更改,如果有人可以在评论中分享一些关于这一点的信息,那就太好了!:)

于 2019-11-30T00:29:55.077 回答