Ruby模型方法更新不通过控制器

时间:2013-11-30 02:43:03

标签: ruby-on-rails

我希望有人可以提供帮助。我怀疑这是一个令人尴尬的新手问题,但是,我很尴尬。我已经到处尝试过我能想到的答案,并尝试了我能想到的每一种排列。

任务: 我正在研究一个管理在线购物车的Ruby教程中的示例。任务是在购物车中显示的每个项目旁边创建一个按钮,使您可以将单个项目的数量减少1.

问题: 当我在视图中单击数量为1的项目旁边的“递减”按钮时,它会按预期从购物车中消失。但是,当我点击数量超过一个项目旁边的按钮时,没有任何反应。

代码

查看:

<td><%= button_to("Decrement", decrement_line_item_path(line_item), method: :post ) %>
</td>

(我在routes.rb中设置了一个成员路由,以便它访问“POST”上的减量操作)

控制器:

def decrement
    @cart = set_cart
    @line_item = @cart.line_items.find_by(params[:id])
    @line_item = @cart.decrement_line_item_quantity(@line_item.id)
    respond_to do |format|
        format.html {redirect_to store_url}
    end
end

(关注文件中有一个set_cart方法,只根据会话获取或设置购物车,我知道这样做有效)。

型号:

def decrement_line_item_quantity(item_id)
  item_to_decrement = line_items.find_by(id: item_id)
  if item_to_decrement.quantity > 1
    item_to_decrement.quantity -= 1
  else
    item_to_decrement.destroy
  end
  item_to_decrement
end

我的调试器说:

  1. item_to_decrement.quantity在模型方法中按预期减少
  2. @ line_item.quantity在控制器方法中也会按预期减少
  3. 但实际购物车中订单项数量的值在控制器方法中似乎没有变化。我从模型方法返回后检查调试器中的@ cart.line_items.find_by(params [:id])。数量,并且没有改变。

    这意味着当我以后再来看我的购物车时,具有多个单位的商品的数量不会减少,所以没有任何反应。

    有人能告诉我我错过了什么吗?这是我第一次使用Stack Overflow,所以我还在学习。已经阅读了指南,我希望我能够正确地遵循它们。对任何违规行为表示歉意,并提前感谢。

1 个答案:

答案 0 :(得分:1)

您必须在减少数量后保存记录,否则数量的变化将不会持久保存到数据库中:

def decrement_line_item_quantity(item_id)
  item_to_decrement = line_items.find_by(id: item_id)
  if item_to_decrement.quantity > 1
    item_to_decrement.quantity -= 1
    item_to_decrement.save
  else
    item_to_decrement.destroy
  end
  item_to_decrement
end