我正在尝试在 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 (我认为回购是公开的),
如果有人想更多地查找代码。