Multiple Forms One Model

I have the following scenario and am trying to find the best way to
accomplish it.

Model:
I have an Order model which accepts a customers billing & shipping
address, order info and order item details.

Controller:
I have a store_controller which currently has a checkout action and a
save_order action.

View:

  1. I have one template / page (checkout.html.erb) with a form for the
    customer to enter their billing and shipping info.
  2. I need another template / page which based on the customers country
    selection in the previous page displays the correct currency and
    calculates the correct VAT or Tax info. This will update and display
    the cart totals. The customer will also on this page enter in their
    credit card info and submit for order processing.

Here’s where I have the question.

As you can see I need to break up my checkout page into two pages.
One for billing and shipping info, and one for the final checkout
confirmation and the customer to enter their credit card info. After
the credit card is authorized this would all get submitted to the
Order model for validation and saving.

I have done this plenty of times in the past but not in Rails and
wanted to try and find a “rails way” to solve this.

How would you tackle this problem?

Thanks very much.

I would have an orderaddress object that you can split to shipping and
billing address that belongs to your order model, like this:

belongs_to :billing_address, :class_name => ‘OrderAddress’,
:foreign_key => ‘billing_address_id’,
:dependent => :destroy
belongs_to :shipping_address, :class_name => ‘OrderAddress’,
:foreign_key => ‘shipping_address_id’,
:dependent => :destroy

Validate and save this information before going to the cc page. And
most likely you do not want to save the creditcard info anyways so it
will be virtual attributes that you validate within the order model.

Thats some information that might help… I’m kinda in the middle of
spliting my own page so the next step someone else can answer :slight_smile: