Rails App:模型或控制器中的方法

时间:2015-09-16 13:45:08

标签: ruby-on-rails model controller

我是一名初学者,并继续阅读“Rails中的敏捷Web开发”一书,并创建了一个书店应用程序。在此过程中,我通过在购物车中添加书籍数量以及为同一产品的多个项目添加一个订单项来将购物车更改为“更智能”。

本书建议(但不解释),提出一种方法,在carts模型中添加产品并在line_items控制器中的cart对象上调用它。我是否可以不将此方法放在购物车控制器中以使购物车对象能够访问它?是一种比另一种做得更好的方式,还是偏好?

这是型号代码:

class Cart < ActiveRecord::Base
  has_many :line_items, dependent: :destroy

  def add_product(product_id)
    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
end

这是控制器代码:

class LineItemsController < ApplicationController
  before_action :set_line_item, only: [:show, :edit, :update, :destroy]

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

    respond_to do |format|
      if @line_item.save
        format.html { redirect_to @line_item.cart, notice: 'Line item was successfully created.' }
        format.json { render :show, status: :created, location: @line_item }
      else
        format.html { render :new }
        format.json { render json: @line_item.errors, status: :unprocessable_entity }
      end
    end
  end

1 个答案:

答案 0 :(得分:1)

Rails的方法是保持控制器的瘦(非常简单),并尽可能地为模型层添加逻辑。此方法应该在模型中。

对于你的另一个问题:

  

我是否可以不将此方法放入购物车控制器中以使购物车对象能够访问它?

具体来说,这是个坏主意。您不希望模型(购物车对象)访问或调用控制器中的任何内容。控制器应调用(依赖于)模型层,但反之亦然。

希望这有帮助! :)