0

Order、Billing、および Shipping Address オブジェクトを入力するフォーム オブジェクトを作成しました。populateメソッドはかなり冗長に見えます。フォーム フィールドは Address 属性に直接対応していないため、手動で割り当てる必要があります。例えば:

shipping_address.name = params[:shipping_name]
billing_address.name  = params[:billing_name]

これがオブジェクトです。簡潔にするために、ほとんどの住所フィールドと検証、およびその他のコードを省略していることに注意してください。しかし、これはあなたにアイデアを与えるはずです。populate メソッドに注意してください。

class OrderForm
  attr_accessor :params

  delegate :email, :bill_to_shipping_address, to: :order
  delegate :name, :street, to: :shipping_address, prefix: :shipping
  delegate :name, :street, to: :billing_address,  prefix: :billing

  validates :shipping_name, presence: true
  validates :billing_name,  presence: true, unless: -> { bill_to_shipping_address }

  def initialize(item, params = nil, customer = nil)
    @item, @params, @customer = item, params, customer
  end

  def submit
    populate
    # snip
  end

  def order
    @order ||= @item.build_order do |order|
      order.customer = @customer if @customer
    end
  end

  def shipping_address
    @shipping_address ||= order.build_shipping_address
  end

  def billing_address
    @billing_address ||= order.build_billing_address
  end

  def populate
    order.email = params[:email]

    shipping_address.name          = params[:shipping_name]
    shipping_address.street        = params[:shipping_street]
    # Repeat for city, state, post, code, etc...

    if order.bill_to_shipping_address?
      billing_address.name          = params[:shipping_name]
      billing_address.street        = params[:shipping_street]
      # Repeat for city, state, post, code, etc...
    else
      billing_address.name          = params[:billing_name]
      billing_address.street        = params[:billing_street]
      # Repeat for city, state, post, code, etc...
    end
  end
end

コントローラーのコードは次のとおりです。

  def new
    @order_form = OrderForm.new(@item)
  end

  def create
    @order_form = OrderForm.new(@item, params[:order], current_user)
    if @order_form.submit
      # handle payment
    else
      render 'new'
    end
  end

いいえ、私は興味がありませんaccepts_nested_attributes_for.

4

4 に答える 4

2
def populate
  order.email = params[:email]
  shipping_params = %i[shipping_name shipping_street]
  billing_params = order.bill_to_shipping_address? ?
   shipping_params : %i[billing_name billing_street]

  [[shipping_address, shipping_params], [billing_address, billing_params]]
  .each{|a, p|
     a.name, a.street = params.at(*p)
  }
end
于 2013-07-26T16:53:50.923 に答える