我是一名初学者,并继续阅读“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
答案 0 :(得分:1)
Rails的方法是保持控制器的瘦(非常简单),并尽可能地为模型层添加逻辑。此方法应该在模型中。
对于你的另一个问题:
我是否可以不将此方法放入购物车控制器中以使购物车对象能够访问它?
具体来说,这是个坏主意。您不希望模型(购物车对象)访问或调用控制器中的任何内容。控制器应调用(依赖于)模型层,但反之亦然。
希望这有帮助! :)