注文コントローラーに次のアクションがあります。
# 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