Pre-populating association

Hello,

I think this is an easy one for the average Rails developer but I’m a
bit stuck.

I’m creating a simple voting app: any user can create a survey, with any
number of questions, and other users can then vote by creating a ballot
for that survey.

Here’s the modeling:

class Survey < ActiveRecord::Base
has_many :questions
has_many :eligibilities
has_many :ballots

accepts_nested_attributes_for :questions, :allow_destroy => true

attr_accessible :title, :description, :status, :deadline,
:questions_attributes

def owner
Person.find(owner_id)
end
end

class Question < ActiveRecord::Base
belongs_to :survey
has_many :preferences
end

class Ballot < ActiveRecord::Base
belongs_to :survey
has_many :preferences
end

class Preference < ActiveRecord::Base
belongs_to :ballot
belongs_to :question
end

To be clear: a survey is the set of questions and a ballot is a voter’s
set of answers (preferences).

I’m using the nested route: /surveys/[:survey_id]/ballot/new for the
voting page.

What I’m having trouble with is pre-populating the ballot with empty
preferences. When ballot/new is called, I do this:

def new
@survey = Survey.find(params[:survey_id])

@ballot = @survey.ballots.build

# Prepare the ballot
for question in @ballot.survey.questions
  p = Preference.new
  p.ballot = @ballot
  p.question = question
  @ballot.preferences << p
end

respond_to do |format|
  format.html # new.html.erb
  format.xml  { render :xml => @ballot }
end

end

and on the ballot/new.html.erb page, I try this:

<%= form_for [@survey, @ballot] do |f| %>
<%= f.fields_for :preferences do |preference_form| %>
<%= preference_form.fields_for :question do |question_form| %>


<%= question_form.label :question %>

<%= radio_button(“preference”, “preference”, “Yes”) %> Yes
<%= radio_button(“preference”, “preference”, “No”) %> No
<%= radio_button(“preference”, “preference”, “Decline”) %> Decline


<% end %>
<% end %>
<%= f.submit "Vote" %>
<% end %>

But this merely shows one set of radio buttons with no question text,
though I’ve confirmed the @survey.questions are populated with
questions.

Does anybody see what I’m doing wrong here? My guess is looking at the
new.html.erb is going to really show off something incorrect.

Christopher Thielen

I think this is related to

.

I decided to change my …/ballot/new controller to:

def new
@survey = Survey.find(params[:survey_id])

@ballot = @survey.ballots.build

# Prepare the ballot
@ballot.preferences = @survey.questions.map{|question| 

question.preferences.build}
#for question in @ballot.survey.questions
# p = Preference.new
# p.ballot = @ballot
# p.question = question
# @ballot.preferences << p
#end

respond_to do |format|
  format.html # new.html.erb
  format.xml  { render :xml => @ballot }
end

end

And the new view to:

<%= form_for [@survey, @ballot] do |f| %>
<%=h @ballot.preferences[0].question.inspect %>

<%= f.fields_for @ballot.preferences do |preference_form| %>
<%= preference_form.fields_for :question do |question_form| %>


<%= question_form.label :question %>

<%= radio_button(“preference”, “preference”, “Yes”) %> Yes
<%= radio_button(“preference”, “preference”, “No”) %> No
<%= radio_button(“preference”, “preference”, “Decline”) %> Decline


<% end %>
<% end %>

<%= f.submit "Vote" %>
<% end %>

And now I receive the error:
undefined method `model_name’ for Array:Class

for the fields_for line.

My guess is @ballot.preferences isn’t a proper set of instances but just
an array, though my Ruby on Rails skills aren’t good enough to figure
this out. Any ideas?

I was able to resolve this problem. For those curious: