如果我想减少对象的counter属性,最好将其添加到update
操作或destroy
操作,还是更好地创建新的动作吗
为了更好地解释,我们假设您有Product
和CartItem
课程,并且每次用户将相同的产品添加到购物车时,而不是拥有两个副本相同的CartItem
对象,您可以增加amount
的{{1}}属性。
如果我想让用户减少金额,我应该使用什么?例如,类似下面的代码是一种可行且传统的方法吗?或者创建新动作会更好吗?
查看:
CartItem
控制器:
...
<%= button_to 'Remove One', [cart_item, remove_one: true], method: :patch %>
...
注意:我知道标题听起来有点误导,但我不是在寻找一种方法来减少Rails中的属性。我想知道的是,如果你有这样一个要求,你会把它放在哪个动作中? 您如何决定采取何种行动?
编辑:伙计们我真的期待一些可信的东西,例如来自维护良好的源代码,高评价书等的例子。在这种情况下,不幸的是我不会成为能够将赏金奖励给任何人。
答案 0 :(得分:0)
我认为没有100%正确答案,但根据我的经验,我看到两个选项比代码示例更好:
对控制器和控制器进行减量操作,使用decrement_counter
方法(doc)。如果您在同一型号上同时进行更新,这会有所帮助(尽管购物车通常不会这样)。
有一个更新方法,并在视图中呈现一个小表单:
视图
<%= form_for cart_item do |form| %>
<%= form.hidden_field :quantity, cart_item.quantity-1 %>
<%= form.submit 'Remove One'
<% end %>
在控制器中
def update
@cart_item.update(cart_item_params)
@cart_item.destroy if @cart_item.quantity == 0
#in the above
redirect_to :back
end
def cart_item_params
params.require(:cart_item).permit(:quantity)
end
答案 1 :(得分:0)
在CartItem
类中添加专用方法...例如
##it will return either true or false
def !!update_amount
###use if condition if you need
if self.quantity > 1
self.update_attribute :amount,self.amount+=amount-1
end
end
在任何地方使用它,例如: -
def update
if params[:remove_one]
##call the method to get only true or false
if @cart_item.update_amount
flash[:notice] = "Removed one of #{@cart_item.product.title}"
redirect_to :back
else
destroy
end
end
return
end
答案 2 :(得分:0)
对我而言,在单独的方法中使用它在语义上是有意义的。
您正在更新模型上的属性,这意味着您应该使用PATCH
方法,并且最好根据每个rails的约定调用update
方法,因此在我看来,这个单独的方法调用应该在不改变RESTful路由的情况下执行。
before_action :inventory_check, only: :update
def update
if @cart_item.update
flash[:notice] = "Updated your cart."
else
flash[:error] = "Couldn't update your cart."
end
redirect_to :back
end
def destroy
@cart_item.destroy
flash[:notice] = "Item removed from your cart."
redirect_to :back
end
private
def inventory_check
if params[:decrement] && @cart_item.quantity == 1
redirect_to :destroy
end
end
答案 3 :(得分:0)
在我看来,CartItem
对象描述了Product
和Card
之间的多对多关系。因此,当您向Product
添加Cart
时,您只需更新(或创建尚未确定的内容)特定Production
的内容 - {{1关系。
从这个意义上说,我建议你把减量放在Cart
方法中。但是,如果您想要更多逻辑来确定此关系是否存在,您还可以创建一个新方法并在其中执行所有验证。