views:

24

answers:

1

Hello,

I have been working with rails3 and have been trying to create a simple survey application but some issues have come up. I can create questions just fine but when it comes to creating a survey that people can take I come accross some issues. For one the answers aren't being assigned a :user_id or :survey_id. The following is a copy of my controllers, models and views.

Survey Controller

def take
  @survey = Survey.find(params[:id])
  @questions = @survey.questions
  @answers = @questions.map{|q| q.answers.build}
  @answers.each do |a|
    a.survey_id = @survey.id
    a.user_id = current_user.id
  end

  respond_to do |format|
    format.html #
  end
end

def submit
  @survey = Survey.find(params[:id])

  respond_to do |format|
    if @survey.update_attributes(params[:survey])
      format.html { redirect_to(@survey, :notice => 'Survey was successfully submitted.')}
      format.xml  { head :ok }
    else
      format.html { render :action => "edit" }
      format.xml  { render :xml => @survey.errors, :status => :unprocessable_entity }
    end
  end
end

Survey Model

class Survey < ActiveRecord::Base
  belongs_to :user
  has_many :questions, :dependent => :destroy
  has_many :answers, :through => :questions, :dependent => :destroy
  validates_presence_of :name, :user_id
  accepts_nested_attributes_for :questions, :allow_destroy => true
end

Questions Model

    class Question < ActiveRecord::Base
     belongs_to :survey
     has_many :answers
     validates_presence_of :question_string, :question_type
     accepts_nested_attributes_for :answers, :allow_destroy => true
    end

Answers Model

    class Answer < ActiveRecord::Base
     belongs_to :question
     belongs_to :user
     belongs_to :survey
    end

Take View

    %h1 Take the survey
    - semantic_form_for @survey, :url => { :action => "submit" } do |s|
     - if @survey.errors.any?
        %p= pluralize(@survey.errors.count, "error") + " prohibited this survey from being saved"
        #survey_errors
         - @survey.errors.full_messages.each do |err_msg|
            %p= err_msg
     #survey_details.header
     = s.fields_for :questions do |q|
        = q.fields_for :answers do |a|
         = render 'answer_fields', :s => a

     .actions
        = s.commit_button

Questions Partial

    #questions_form.fields
     = s.input :question_string, :label => "Question: "
     = s.input :question_type, :as => :radio, :collection => [1,2,3,4], :label => "Question Type:"
     = s.hidden_field :_destroy
     = link_to_function  "Remove Question", "remove_fields(this)"

Answers Partial

    #answers_form.fields
     = s.label :answer_string, "Answer"
     = s.text_field :answer_string
     = s.hidden_field :question_id

Routes.rb

    resources :surveys do
        get 'take', :on => :member
        put 'submit', :on => :member
    end
A: 

try adding another hidden field with the user id in your answers partial.

s.hidden_field :user_id, :value => x

That is how I have done hidden fields, you are just putting the variables in there. I have encountered merge problems by not passing it as key value pair.


What are you using? HAML, I don't really understand how that is working.

This is all you need for everything to work.

Survey model

has_many :answers
accepts_nested_attributes_for :answers, :allow_destroy => true

The controller doesn't need additional code

The view needs fields_for

 <% f.fields for :answers do |f| %>
     <%= f.hidden_field :user_id, :value => current_user.id %>
 <% end %>
Sam
thank you. that worked...but how do i make it so that it only updates their answers now. because if i fill out the form and refresh after the answers are created...it returns the forms filled with the old answers and new answers
salbito
I'm not sure about why the old and new answers are getting displayed. Do you mean duplicates are getting created? I just not too sure.
Sam