Betjamin Richards
Betjamin Richards

Reputation: 941

How to setup a deeply nested form in Rails 3.2

I'm trying to build a rather complex nested form in rails and am stuck.

Basically, I have three models - Applicant, DataPoint, ApplicantDataPointValue .

The user can create a new DataPoint, give it a name ("gender" etc.) select it's type ("string","integer" etc.). The type determines what column the data will eventually be saved in in the ApplicantDataPointValue table.

I then want the user, when they're creating a new Applicant, to be able to add a value for each DataPoint into the ApplicantDataPointValue table

My models look like the following:

Applicant:

class Applicant < ActiveRecord::Base
  has_many :applicant_data_point_values, dependent: :destroy
  has_many :data_points, :through => :applicant_data_point_values

  accepts_nested_attributes_for :data_points
  accepts_nested_attributes_for :applicant_data_point_values

  attr_accessible :data_points_attributes, :applicant_data_point_values_attributes
end

DataPoint:

class DataPoint < ActiveRecord::Base
  has_many :applicant_data_point_values
  has_many :applicants, :through => :applicant_data_point_values
  accepts_nested_attributes_for :applicant_data_point_values
end

ApplicantDataPointValue:

class ApplicantDataPointValue < ActiveRecord::Base
  belongs_to :data_point
  belongs_to :applicant
end

But I'm at a loss to what to do in the 'new' and 'create' sections of my controller or how to construct the form.

Any insight would be greatly appreciated.

Upvotes: 0

Views: 145

Answers (1)

Fiona T
Fiona T

Reputation: 1929

From what I understand, the form for the User will also have multiple ApplicantDataPointValue fields. (but that form won't allow creating of new DataPoint fields, right?)

In the controller new action, you'll want to set up your model with associated data point values:

def new
  @user = User.new
  DataPoint.all.each do |data_point|
    applicant_data_point_value = @user.applicant_data_point_values.build
    applicant_data_point_value.data_point = data_point
  end
end

And then, display a text box for each data point value.

<%= form_for @user do |f| %>
    <%= f.label :name %>
    <%= f.text_field :name %>
  <% @user.applicant_data_point_values.each do |data_point_value| %>
  <%= f.fields_for :applicant_data_point_values, data_point_value do |fields| %>

    <%= fields.label :value, data_point_value.data_point.type %>
    <%= fields.text_field :value %>

  <% end %>
<% end %>

Reference: http://railscasts.com/episodes/196-nested-model-form-part-1

Upvotes: 1

Related Questions