我正在寻找无需重新加载页面即可更新玩具电子商务应用程序中的购物车的方法,并且我一直在跟踪this笔。
例如,更新产品数量的代码如下:
$('.product-quantity input').change( function() {
updateQuantity(this);
});
它工作得很好,但是数据库目前还没有更新。
我想知道用产品数量或类似操作更新前端和数据库的最佳方法是什么?我可能正在寻找AJAX,但不确定最新的最佳做法是什么(最好使用尽可能少的JS)。
答案 0 :(得分:1)
您的updateQuantity()
函数必须对您的控制器中的方法进行ajax调用,该方法处理数据库中的更改并响应json或js来操纵dom。
function updateCart(e){
$.ajax({
type: "patch",
url: 'your_route_to_method', //point to the route that updates the item
data: {
your_resource_scope: { quantity: e.value } //sanitize input in strong params
},
success: function (response) {
//response is the json you get back from your controller
//handle the logic of whatever happens in the dom after you update the quantity
}
});
}
我建议将要更新的产品的ID附加到输入的父级,以便您可以将其传递到路由,并记住在所需范围内传递值,以便您可以通过strong_params在控制器中清除输入
在您的控制器中:
def update
respond_to do |format|
if @your_resource.update(your_resource_params)
format.json { render json: { key: value } } #build the json you want to return
else
#handle failiure
end
end
如果您决定使用js(而不是json)进行响应,则需要创建一个与您的方法具有相同名称的视图(扩展名为.js或.js.erb(而不是.html / .html.erb))并进行处理js中的成功响应。在此视图中,您可以访问在方法中声明的所有实例变量。例如:
# => update.js.erb or your_custom_method_name.js.erb
$('#resource_#{ @your_resource.id }_price').replaceWith('<p>#{ @your_resource.quantity * @your_resource.price }</p>');
如果您选择这条路线,请记住删除ajax调用的success
部分。