Search code examples
ruby-on-railssimple-form

Rails, Simple Form, Nested Forms


class Project
  has_many :project_questions, dependent: :destroy#, through: :projects
  accepts_nested_attributes_for :project_questions
end

I am trying to make an app with rails 4 and Simple Form.

I have models called projects, project_questions and project_answers.

The associations between them are:

Projects:

has_many :project_questions, dependent: :destroy#, through: :projects
accepts_nested_attributes_for :project_questions

Project questions:

belongs_to :project#, counter_cache: true
has_many :project_answers, dependent: :destroy
belongs_to :user
accepts_nested_attributes_for :project_answers
belongs_to :user

Project answers:

belongs_to :project_question#, counter_cache: true
belongs_to :user

User:

has_many :project_questions
has_many :project_answers

class ProjectQuestions
  belongs_to :project#, counter_cache: true
  has_many :project_answers, dependent: :destroy
  belongs_to :user
  accepts_nested_attributes_for :project_answers
end

ProjectAnswer:

belongs_to :project_question#, counter_cache: true
belongs_to :user 

My objective is to have a partial on my projects show page which displays the questions and their answers relating to the project and to have a link to another form where you can ask a question or answer one. I am struggling.

In my controllers I have:

Projects:

def project_params
  params.require(:project).permit(project_question_attributes: [:title, :content, :user_id, :project_id,project_answer_attributes: [:answer, :project_question_id]],

Project_question:

def new
  @project_question = ProjectQuestion.new
  @project_id = params[:project_id]
  @project_question.project_answers[0] = ProjectAnswer.new
end

Project_answer:

def new
  @project_answer = ProjectAnswer.new
end

def project_question_params
    params[:project_question].permit(:id, :title, :content, :project_id,   :user_id,project_answer_atttibutes: [:id, :answer, :project_question_id, :user_id])
end

Then in my views I have:

Project#show:

<% if current_user.id ==  @project.creator_id %>
    <%= link_to 'Ask a question', new_project_project_question_path(:project_id => @project.id) %> 
  <% end %>

  <%= render 'project_questions/pqps' %>

Project_question#pqps (a partial):

<div class="containerfluid">
  <div class="row">
    <div class="col-md-10 col-md-offset-1">
          <div class="categorytitle">
            <%= @project_question.try(:title) %>
          </div>
          <div class="generaltext">
            <%= @project_question.try(:content) %>
          </div>
          <span class="editproject">   
              <% if current_user.id == @project.creator_id %>
              <% end %>
          </span>
    </div>
  </div>
</div>

My project_questions form partial is:

<div class="containerfluid">
  <div class="row">
    <div class="col-md-10 col-md-offset-1">
          <% f.simple_fields_for :project_questions do |f| %>
              <%= f.input :project_id, as: :hidden, input_html: {value: @project_question_id} %>
              <%= f.input :title, label: 'Question:', :label_html => {:class => 'categorytitle'}, placeholder: 'Type your question here', :input_html => {:style => 'width: 100%', class: 'categorytitle'} %>
              <%= f.input :content, label: 'Is there any context or other information?', :label_html => {:class => 'categorytitle'}, placeholder: 'Context might help to answer your question', :input_html => {:style => 'width: 100%', rows: 5, class: 'generalprojecttext'} %>
              <%= f.button :submit %>   
           <% end %>
    </div>
  </div>
</div>

Project_answer#pa (a partial):

(not yet written - still trying to get the questions to work)

My routes are:

resources :projects do
    resources :project_questions do
      resources :project_answers
    end
end

When I try this, I get an error in my project_questions form that says:undefined local variable or methodf' for #<#:0x000001013d8298>`

I can't see where it is talking about f outside the form block. I have tried adding another line to the form for simple_fields for project and then nesting the project questions form inside of it, but that doesn't change anything.

Can anyone see what I've done wrong?

Thank you


Solution

  • You should change this line <% f.simple_fields_for :project_questions do |f| %> to this <%= simple_form_for :project_questions do |f| %> in order to make it work.