I'm trying to get a nested form working to create an association between a user and their address in one form.
The issue I"m seeing is that whenever validation fails, the inner address fields form is not repopulating, or showing the validation errors.
Here's the form:
<%= simple_form_for(@user, :url => register_and_checkout_path, :html => {:class => "form-horizontal clearfix"}) do |f| %>
<p>New Member & Guest</p>
<small>Mandatory fields marked*</small>
<%= f.error_notification %>
<%= f.input :is_checkout, :as => :hidden, :input_html => { :value => true } %>
<%= f.input :first_name, :input_html => {:class => "input-xlarge"} %>
<%= f.input :last_name, :input_html => {:class => "input-xlarge"} %>
<%= f.input :email, :input_html => {:class => "input-xlarge", :placeholder => "[email protected]"} %>
<%= simple_fields_for (:address) do |a| %>
<%= a.input :phone1, :label => "Contact number", :input_html => {:class => "input-xlarge"} %>
<p class="uppercase">Your Address</p>
<%= a.input :address_1, :label => "Street Address", :input_html => {:class => "input-xlarge"} %>
<%= a.input :address_2, :label => false, :input_html => {:class => "input-xlarge"} %>
<%= a.input :address_3, :label => false, :input_html => {:class => "input-xlarge"} %>
<%= a.input :suburb, :input_html => {:class => "input-xlarge"} %>
<%= a.input :state, :input_html => {:class => "input-xlarge"} %>
<%= a.input :postcode, :label => "Postcode/zipcode", :input_html => {:class => "input-xlarge"} %>
<%= a.input :country, :priority => [ "Australia", "New Zealand", "Unites States", "United Kingdom" ] %>
<% end %>
<p>Become a valued member</p>
<%= f.input :password, :input_html => {:class => "input-xlarge"} %>
<%= content_tag(:button, :class => 'btn btn-large btn-success floatright') do %> <%= content_tag :i, '', :class => 'icon-white icon-shopping-cart' %> Register and Checkout <% end %>
<% end %>
</div>
and my attempt at reading the params (this is part of a large order controller create method)
if params[:is_register]
Rails.logger.debug {"Registering before checking out"}
@user = Member::User.new(params[:member_user])
@user.address = Member::Address.new(params[:address])
Rails.logger.debug {"address params " +params[:address].to_yaml }
@user.pending_order = Checkout::Order.new()
@user.pending_order.status = 'P'
Rails.logger.debug {"Saving the new user record " + @user.to_yaml}
Rails.logger.debug {"Saving the new user address record " + @user.address.to_yaml}
end
Rails.logger.debug {"Value of user " + @user.to_yaml}
respond_to do |format|
if params[:is_login] and user
format.html { render :shipping_billing }
format.json { render json: @order, status: :created, location: @order }
elsif params[:is_register] and @user and @user.save and @user.address.save
Rails.logger.debug {"Saved new customer account and address"}
format.html { render :shipping_billing, :notice => "Your account was successfully registered"}
format.json { render json: @order}
else
format.html { render action: "new", :notice => "Could not log in" }
format.json { render json: @checkout_order.errors, status: :unprocessable_entity }
end
end
And finally the relevant model:
class Member::User < ActiveRecord::Base
authenticates_with_sorcery!
# attr_accessible :title, :body
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :address, :address_attributes, :first_name, :last_name, :order_attributes, :pending_order, :is_checkout
attr_accessor :is_checkout
# Orders and Order History
has_many :orders, :class_name => "Checkout::Order"
has_one :pending_order,
:class_name => "Checkout::Order",
:conditions => ['status = ?', 'P']
has_many :addresses, :class_name => "Member::Address"
has_one :primary_billing_address,
:class_name => "Member::Address",
:conditions => ['is_primary_billing = ?',true]
has_one :primary_shipping_address,
:class_name => "Member::Address",
:conditions => ['is_primary_shipping = ?',true]
has_one :address,
:class_name => "Member::Address",
:conditions => ['is_primary_billing = ?', true]
accepts_nested_attributes_for :address
accepts_nested_attributes_for :pending_order
validates_presence_of :email, :password, :first_name, :last_name
validates_confirmation_of :password
validates_uniqueness_of :email
end