【发布时间】:2012-09-16 18:10:37
【问题描述】:
我的订单控制器中有此操作:
# POST /orders
# POST /orders.json
def create
@order = Order.new(params[:order])
#spostare il ciclo cart > line_items come metodo del modello Order
cart = session[:cart]
cart.each do | id, quantity |
item = Project.find_by_id(id)
@line_item = LineItem.new
@line_item.project = item
@line_item.quantity = quantity
@line_item.price = item.price
@order.line_items << @line_item
end
@order.user = current_user
session.delete(:cart)
respond_to do |format|
if @order.save
#Send an email to admin
UserMailer.order_created_to_admin(@order).deliver
format.html { redirect_to :dashboard, notice: "L'ordine è stato creato correttamente." }
format.json { render json: @order, status: :created, location: @order }
else
format.html { render action: "new" }
format.json { render json: @order.errors, status: :unprocessable_entity }
end
end
end
现在我想对其进行一些重构,我正在考虑将以下几行作为方法移至 Order Model:
cart.each do | id, quantity |
item = Project.find_by_id(id)
@line_item = LineItem.new
@line_item.project = item
@line_item.quantity = quantity
@line_item.price = item.price
@order.line_items << @line_item
end
这样:
class Order < ActiveRecord::Base
attr_accessible :user_id
belongs_to :user
has_many :line_items, :dependent => :destroy
accepts_nested_attributes_for :line_items, :allow_destroy => true
def add_line_items_to_order_from_cart(cart) do
cart.each do | id, quantity |
item = Project.find_by_id(id)
@line_item = LineItem.new
@line_item.project = item
@line_item.quantity = quantity
@line_item.price = item.price
line_items << @line_item
end
end
end
并从控制器调用它,例如:
order.add_line_items_to_order_from_cart(cart)
就“瘦控制器/胖模型”模式而言是否有意义?
谢谢
编辑
我的订单模型现在:
class Order < ActiveRecord::Base
attr_accessible :user_id
belongs_to :user
has_many :line_items, :dependent => :destroy
accepts_nested_attributes_for :line_items, :allow_destroy => true
validates :user, :presence => :true
def add_line_items_to_order_from_cart(cart)
cart.each do | id, quantity |
item = Project.find(id)
line_items << LineItem.new(project: item,
quantity: quantity,
price: item.price)
end
end
end
【问题讨论】:
-
是的,这真的很有意义!我是“瘦控制器/胖模型”模式的粉丝 :)
-
嗨@BlueSmith,谢谢!我在想所有对其他模型 Project 和 LineItems 的“调用”都可能是模型内部的问题。
标签: ruby-on-rails ruby ruby-on-rails-3 refactoring