0

注文コントローラーに次のアクションがあります。

# 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
4

1 に答える 1

0

私には理にかなっています。あなたはモデルにハッシュを提供しており、モデルはハッシュを解析してデータベースレコードに変換する責任があります。

line_item 全体を 1 行に移動すると、少しすっきりするかもしれません。

def add_line_items_to_order_from_cart(cart) do
  cart.each do |id, quantity|
    item = Project.find_by_id(id)
    line_items << LineItem.new( project: item,
                                quantity: quantity,
                                price: item.price )
  end
end

次の方法で試すこともできます。

def add_line_items_to_order_from_cart(cart) do
  line_items = cart.map do |id, quantity|
    item = Project.find_by_id(id)
    LineItem.new( project: item,
                  quantity: quantity,
                  price: item.price )
  end
end

しかし、一般的な考え方は正しいです。そのようなものをモデルに移動してください! ;)

于 2012-09-16T18:35:52.483 に答える