I’m trying to create a nested group for customer profiles with multiple billing addresses and postal addresses.When I browse to the customer profile form I see the fields for the Customer profile form but I do not see any fields for the Billing Address form or Postal Address form. Any ideas? my controller, models and view are below.
The goal is to have one customer profile which can multiple billing addresses and multiple postal addresses.
customer profile model:
class CustomerProfile < ActiveRecord::Base
#These entries are required to create a nested model form (multiple models in one form)
validates_presence_of :customerNumber
validates_uniqueness_of :customerNumber
has_many :billing_addresses, :dependent => :destroy
has_many :postal_addresses, :dependent => :destroy
accepts_nested_attributes_for :billing_addresses, :reject_if => lambda { |a| a[:content].blank?}, :allow_destroy => true
accepts_nested_attributes_for :postal_addresses, :reject_if => lambda { |a| a[:content].blank?}, :allow_destroy => true
end
billing address model:
class BillingAddress < ActiveRecord::Base
belongs_to :customer_profile
attr_protected :customerNumber
end
postal address model:
class PostalAddress < ActiveRecord::Base
belongs_to :customer_profile
attr_protected :customerNumber
end
customer profile controller:
def new
@customer_profile = CustomerProfile.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @customer_profile }
end
end
def create
@customer_profile = CustomerProfile.new(params[:customer_profile])
respond_to do |format|
if @customer_profile.save
format.html { redirect_to @customer_profile, notice: 'Customer profile was successfully created.' }
format.json { render json: @customer_profile, status: :created, location: @customer_profile }
else
format.html { render action: "new" }
format.json { render json: @customer_profile.errors, status: :unprocessable_entity }
end
end
end
customer profile form:
<br />
<h3>Add new customer profile with Billing and Postal Address</h3>
<br />
<h4> Customer Profile </h4>
<%= form_for @customer_profile do |f| %>
<div class="field">
<%= f.label :customerNumber %><br />
<%= f.text_field :customerNumber %>
</div>
#.... a few other fields removed to keep this short
<br />
<h4> Billing Address </h4>
<%= f.fields_for :billing_addresses do |b| %>
<div class="field">
<%= b.label :addressLine1 %><br />
<%= b.text_field :addressLine1 %>
</div>
#.... a few other fields removed to keep this short
<% end %>
<br />
<h4> Postal Address </h4>
<br />
<%= f.fields_for :postal_addresses do |p| %>
<div class="field">
<%= p.label :addressLine1 %><br />
<%= p.text_field :addressLine1 %>
</div>
#.... a few other fields removed to keep this short
<br />
<% end %>
<%= f.submit %>
<% end %>
The fields_for will show fields for billing_addresses that are children of the customer_profile. If this is a new object, you’ll either need to add one or more, or – add the appropriate fields through JavaScript. You may want to to both, so there’s an empty fields when they get there, then they can add more after.
You can do a
@customer_profile.billing_addresses.buildto have an empty one when the form is rendered.Do you know how to add and remove fields via javascript? It’s covered well on railscasts.