1

I understand some railscasts may be old, but revised shouldn't be. I am trying really hard to overcome nested form, but most answer i get is use a plugin. So i try to make the railcasts from scratch but an exception occurs. I am wondering what would be the Railcasts 196 Updated Version has today with proper code.

Here my code, maybe its a silly mistake from me.

Survey Model

class Survey < ActiveRecord::Base
  has_many :questions, :dependent => :destroy
  accepts_nested_attributes_for :questions , :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true
  attr_accessible :name, :questions_attributes
end

Question Model

class Question < ActiveRecord::Base
  belongs_to :survey
  attr_accessible :content, :question_id

  accepts_nested_attributes_for :answers , :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true
  attr_accessible :name, :answers_attributes
end

Answer Model

class Answer < ActiveRecord::Base
  belongs_to :questions
  attr_accessible :content, :question_id
end

Survey Show Form

<p id="notice"><%= notice %></p>

<div>Name:</div>
<div><%[email protected]%></div>
<% for question in @survey.questions %>
<div><%=h question.content%></div>
<% end %>

<%= link_to 'Edit', edit_survey_path(@survey) %> |
<%= link_to 'Back', surveys_path %>

Form.html.erb

<%= form_for(@survey) do |f| %>
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>

  <%= f.fields_for :questions do |bf|%>
    <% render 'question_fields, :f => bf %>
  <% end %>
  ***<div class="actions">***
    <%= f.submit %>
  </div>
<% end %>

question_field Form

<%= f.label :content, "Question" %><br />
<%= f.text_area :content, :rows=> 3 %><br />
<%= f.check_box :_destroy %>
<%= f.label :_destroy, "Remove Question"%><br />

<%= f.fields_for :answer do |form| %>
  <%= render 'answer_fields', :f => form %>
<% end %>

answer_field Form

<%= f.label :content, "Answer" %>
<%= f.text_field :content %>
<%= f.check_box :_destroy %>
<%= f.label :_destroy, "Remove" %>

Survey Controller

class SurveysController < ApplicationController
  # GET /surveys
  # GET /surveys.json
  def index
    @surveys = Survey.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @surveys }
    end
  end

  # GET /surveys/1
  # GET /surveys/1.json
  def show
    @survey = Survey.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @survey }
    end
  end

  # GET /surveys/new
  # GET /surveys/new.json
  def new
    @survey = Survey.new
    3.times {@survey.questions.build }

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @survey }
    end
  end

  # GET /surveys/1/edit
  def edit
    @survey = Survey.find(params[:id])
  end

  # POST /surveys
  # POST /surveys.json
  def create
    @survey = Survey.new(params[:survey])

    respond_to do |format|
      if @survey.save
        format.html { redirect_to @survey, notice: 'Survey was successfully created.' }
        format.json { render json: @survey, status: :created, location: @survey }
      else
        format.html { render action: "new" }
        format.json { render json: @survey.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /surveys/1
  # PUT /surveys/1.json
  def update
    @survey = Survey.find(params[:id])

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

  # DELETE /surveys/1
  # DELETE /surveys/1.json
  def destroy
    @survey = Survey.find(params[:id])
    @survey.destroy

    respond_to do |format|
      format.html { redirect_to surveys_url }
      format.json { head :no_content }
    end
  end
end

Here my error when creating a new survey Not sure what else could be wrong

ArgumentError in SurveysController#create    
No association found for name `answers'. Has it been defined yet?

Here the new error

SyntaxError in Surveys#new

Showing /home/jean/rail/surveysays/app/views/surveys/_form.html.erb where line #22 raised:

/home/jean/rail/surveysays/app/views/surveys/_form.html.erb:22: syntax error, unexpected keyword_class, expecting keyword_do or '{' or '('
@output_buffer.safe_concat('  <div class="actions">
                                        ^
/home/jean/rail/surveysays/app/views/surveys/_form.html.erb:24: unterminated regexp meets end of file
/home/jean/rail/surveysays/app/views/surveys/_form.html.erb:24: syntax error, unexpected $end, expecting keyword_end

1 Answer 1

2

Add has_many :answers to the Question model and change the Answer model to belongs_to :question.

Sign up to request clarification or add additional context in comments.

4 Comments

It solve the association error, however i am having a missing end tag error
I just added the form, its say in div class="" section
You're missing a closing quote: <% render 'question_fields, :f => bf %>. You also want to use a <%= there. It's easy to find these errors if you paste your code into a text editor or IDE with syntax highlighting.
Thank you, at least this works, now i need to play with it but the basic nested form do works, its bring my moral up thank you very much!!!!!!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.