2

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 &amp; 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

1 Answer 1

0

For anyone else looking for the answer to this question, I figured it out, it was remarkably simple mistake after all the hours spent trying to figure this out it was this line in the form.

<%= f.simple_fields_for :address do |a| %>

Notice that simple_fields_for is now referenced by the container form builder.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.