递减属性的常规方法,使用哪种动作?

时间:2015-01-19 23:05:15

标签: ruby-on-rails rest restful-architecture convention

如果我想减少对象的counter属性,最好将其添加到update操作或destroy操作,还是更好地创建新的动作吗

为了更好地解释,我们假设您有ProductCartItem课程,并且每次用户将相同的产品添加到购物车时,而不是拥有两个副本相同的CartItem对象,您可以增加amount的{​​{1}}属性。

如果我想让用户减少金额,我应该使用什么?例如,类似下面的代码是一种可行且传统的方法吗?或者创建新动作会更好吗?

查看:

CartItem

控制器:

...
<%= button_to 'Remove One', [cart_item, remove_one: true], method: :patch %>
...

注意:我知道标题听起来有点误导,但我不是在寻找一种方法来减少Rails中的属性。我想知道的是,如果你有这样一个要求,你会把它放在哪个动作中? 您如何决定采取何种行动?

编辑:伙计们我真的期待一些可信的东西,例如来自维护良好的源代码,高评价书等的例子。在这种情况下,不幸的是我不会成为能够将赏金奖励给任何人。

4 个答案:

答案 0 :(得分:0)

我认为没有100%正确答案,但根据我的经验,我看到两个选项比代码示例更好:

  1. 对控制器和控制器进行减量操作,使用decrement_counter方法(doc)。如果您在同一型号上同时进行更新,这会有所帮助(尽管购物车通常不会这样)。

  2. 有一个更新方法,并在视图中呈现一个小表单:

  3. 视图

    <%= 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对象描述了ProductCard之间的多对多关系。因此,当您向Product添加Cart时,您只需更新(或创建尚未确定的内容)特定Production的内容 - {{1关系。

从这个意义上说,我建议你把减量放在Cart方法中。但是,如果您想要更多逻辑来确定此关系是否存在,您还可以创建一个新方法并在其中执行所有验证。