gpt4 book ai didi

javascript - rails : Updating quantities in shopping cart

转载 作者:数据小太阳 更新时间:2023-10-29 05:18:18 25 4
gpt4 key购买 nike

这里是 Ruby 新手。我正在学习使用 Rails 进行敏捷 Web 开发。在第 11 章中,它要求您向购物车中的商品添加“减少数量”按钮。我继续并尝试实现增加链接。

问题是当我点击链接时它什么也没做。

line_items_controller.rb

def decrease
@cart = current_cart
@line_item = @cart.decrease(params[:id])

respond_to do |format|
if @line_item.save
format.html { redirect_to store_path, notice: 'Item was successfully updated.' }
format.js { @current_item = @line_item }
format.json { head :ok }
else
format.html { render action: "edit" }
format.json { render json: @line_item.errors, status: :unprocessable_entity}
end
end
end

def increase
@cart = current_cart
@line_item = @cart.increase(params[:id])

respond_to do |format|
if @line_item.save
format.html { redirect_to store_path, notice: 'Item was successfully updated.' }
format.js { @current_item = @line_item }
format.json { head :ok }
else
format.html { render action: "edit" }
format.json { render json: @line_item.errors, status: :unprocessable_entity }
end
end
end

购物车.rb

def decrease(line_item_id)
current_item = line_items.find(line_item_id)
if current_item.quantity > 1
current_item.quantity -= 1
else
current_item.destroy
end
current_item
end

def increase(line_item_id)
current_item = line_items.find(line_item_id)
current_item.quantity += 1
current_item
end

routes.rb

resources :line_items do
put 'decrease', on: :member
put 'increase', on: :member
end

_line_item.html.erb

<% if line_item == @current_item %>
<tr id="current_item">
<% else %>
<tr>
<% end %>
<td><%= line_item.quantity %> &times;</td>
<td><%= line_item.product.title %></td>
<td class="item_price"><%= number_to_currency(line_item.total_price) %></td>
<td><%= link_to "-", decrease_line_item_path(line_item), method: :put, remote: true %></td>
<td><%= link_to "+", increase_line_item_path(line_item), method: :put, remote: true %></td>
<td><%= button_to 'Remove Item', line_item, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>

/line_items/increase.js.erb

$('#cart').html("<%= escape_javascript(render(@cart)) %>");
$('#current_item').css({'background-color':'#88ff88'}).animate({'background-color':'#114411'}, 1000);

/line_items/decrease.js.erb

$('#cart').html("<%= escape_javascript(render(@cart)) %>");
$('#current_item').css({'background-color':'#88ff88'}).animate({'background-color':'#114411'}), 1000);
if ($('#cart tr').length==1) {
// Hide the cart
$('#cart').hide('blind', 1000);
}

如果我忘记了任何重要的事情,请告诉我。提前致谢!

----编辑----

我将代码更改为 Rich 发布的代码,这就是当我单击“+”链接时控制台中显示的内容。

Started GET "/line_items/25/qty" for ::1 at 2016-01-30 23:49:11 -0600

ActionController::RoutingError (No route matches [GET] "/line_items/25/qty"):

所以我看到它需要一条用于 qty 的路线,但我不太确定如何设置它。我猜我们设置的 JS 警报没有触发是因为它在此时被卡住了?

----编辑 2----

现在我将链接作为 POST 传递,并从上行和下行链接中获取此名称错误:

Started POST "/line_items/25/qty" for ::1 at 2016-01-31 09:49:04 -0600
Processing by LineItemsController#qty as JS
Parameters: {"id"=>"25"}
Completed 500 Internal Server Error in 38ms (ActiveRecord: 0.0ms)

NameError (undefined local variable or method `current_cart' for #<LineItemsController:0x007fbfb11ea730>):
app/controllers/line_items_controller.rb:70:in `qty'

这里让我感到困惑的是 current_cartincreasedecrease 方法中起作用,但在 qty 中不起作用。

最佳答案

自从您提出这个问题以来已经过去了一段时间 - 您解决了吗?我对这个问题有一个答案 - 我设法增加/减少购物车中的数字,但没有 Ajax 调用 - 每次单击按钮 - 页面重新加载(我删除了 remote: true)。我没有遵循@Richard Peck 的解决方案,即使它可能是更好的方法。因此,正如他指出的那样,路由必须使用 get 方法,而不是 put (我不太确定为什么 get 而不是 post 应该被使用,但如果 R​​ails 要求它,我很乐意这样做):

  resources :line_items do
get 'decrease', on: :member
get 'increase', on: :member
end

此外,StackExchange 上的其他人注意到我忘记了在 Controller 中允许 increase/decrease 操作,因为我们默认限制了其中的大部分操作:

line_items_controller.rb:

  before_action :set_cart, only: [:create, :decrease, :increase]

所以,我想这两个问题是您的问题(就像我的问题一样)。

line_items_controller.rb:

  def decrease
product = Product.find(params[:product_id])
@line_item = @cart.remove_product(product)

respond_to do |format|
if @line_item.save
format.html { redirect_to cart_path, notice: 'Line item was successfully updated.' }
format.js
format.json { render :show, status: :ok, location: @line_item }
else
format.html { render :edit }
format.json { render json: @line_item.errors, status: :unprocessable_entity }
end
end
end

def increase
product = Product.find(params[:product_id])
@line_item = @cart.add_product(product)

respond_to do |format|
if @line_item.save
format.html { redirect_to :back, notice: 'Line item was successfully updated.' }
format.js
format.json { render :show, status: :ok, location: @line_item }
else
format.html { render :edit }
format.json { render json: @line_item.errors, status: :unprocessable_entity }
end
end
end

cart.rb:

  def add_product(product)
current_item = line_items.find_by(product_id: product.id)
if current_item
current_item.quantity += 1
else
current_item = line_items.build(product_id: product.id)
end
current_item
end

def remove_product(product)
current_item = line_items.find_by(product_id: product.id)
if current_item.quantity > 1
current_item.quantity -= 1
elsif current_item.quantity = 1
current_item.destroy
end
current_item
end

和链接:

<td><%= link_to "-", decrease_line_item_path(product_id: line_item.product), class:"btn btn-danger" %></td>
<td><%= link_to "+", increase_line_item_path(product_id: line_item.product), class:"btn btn-success" %></td>

这会满足您的需求吗?也许有什么想法为什么 Ajax 不起作用?这是完整问题的链接:

https://stackoverflow.com/questions/40551425/rails-ajax-jquery-cant-make-to-render-changes-without-page-refresh

关于javascript - rails : Updating quantities in shopping cart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35104257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com