Surveys

Hello everyone -

I implemented a survey module based on Ryan B.'s Railscasts on nested
forms:

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

I need users to take a survey upon close of a request they had
submitted. The survey builder works great, but Ryan didn’t include a
way to ANSWER the survey questions, so now I’m stuck.

I took a stab at it…

added responses migration:

class CreateResponses < ActiveRecord::Migration
def self.up
create_table :responses do |t|
t.integer :request_id
t.integer :question_id
t.integer :answer_id
t.integer :survey_id
t.timestamps
end
end

def self.down
  drop_table :responses
end

end

created a new response model:

class Response < ActiveRecord::Base
belongs_to :survey
belongs_to :question
has_many :answers
end

added to the existing survey, question and answer models:

class Survey < ActiveRecord::Base
has_many :questions, :dependent => :destroy
has_many :responses
accepts_nested_attributes_for :questions
end

class Question < ActiveRecord::Base
belongs_to :survey
has_many :answers, :dependent => :destroy
has_many :responses
accepts_nested_attributes_for :answers
end

class Answer < ActiveRecord::Base
belongs_to :question
belongs_to :response
end


created responses_controller with a survey_response method:

def survey_response
@request = Request.find(params[:id])
@survey = Survey.find(:first, :conditions => id =
@request.survey_id)
@question = Question.find(:all, :conditions => survey_id =
@survey.id)
@resultSet = Array.new
@question.each do |question|
answers = Answer.find(:all, :conditions => [“question_id = ?”,
question.id])
questionAnswerPair = [question, answers]
@resultSet << questionAnswerPair
questionAnswerPair=[]
answers=[]
end
if request.post?
@response = Response.new(:request_id => @request.id,
:question_id => (params[:question_id],
:answer_id => (params[:answer_id]),
:survey_id => @survey.id,
:note => (params[:note])
)
if @response.save
flash[:notice] = “Your survey has been submitted.”
redirect_to :controller => :requests, :action => ‘list_MyRequests’
@request.update_attribute(:survey_taken, true)
else
flash[:alert] = “Unable to submit your survey.”
end
end
end

created survey_response view:

<% form_for :response, @response, :url => {:controller => :responses,
:action => :survey_response, :id => params[:id]} do |f| %>
<%= f.error_messages %>

Survey for Request #: <%= @request.id %>

Please submit the following survey as it relates to your request for <%= @request.product.name %>, closed on: <%= @request.close_date.strftime("%m/%d/%y") if @request.close_date %>:

<% @resultSet.each do |questionAnswerPair| %> <%= questionAnswerPair[0].content %>
<%= select("@response", "answer_id", questionAnswerPair[1].collect {|answer| [answer.content, answer.id]}, :include_blank => true) %>

<% end %>

Additional Comments:
<%= f.text_area :note, :size => "60x5" %>

<%= f.submit "Submit" %>

<% end %>

The response view renders the question/answers ok, and upon submit, the
page redirects correctly. However, nothing is getting saved to the
database. Can anyone help me? I know I included alot of code, but I
want you to be able to see the whole picture… thanks so much for any
assistance you can provide!

-cb