Rails 4 -Nested Models and Simple Form partial

164 views Asked by At

I am trying to make an app in Rails 4.

I have a projects, project questions and a project answers model.

my models

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

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

class ProjectAnswer
  belongs_to :project_question#, counter_cache: true  
  belongs_to :user 
end

routes.rb

  resources :projects do
  # patch '/toggle-draft', to 'projects#toggle_draft', as: 'toggle_draft'
    resources :project_questions do
      resources :project_answers
    end
  end

In my projects_controller, I have permitted params for project questions and answers as follows:

project_question_attributes: [:title, :content, :user_id, :project_id,
      project_answer_attributes: [:answer, :project_question_id]],

These params are also permitted in the Project questions and project answers controllers.

In my projects view, I want to render a partial that I have made in my project_questions view folder.

projects/show

  <%= link_to 'Ask a question', new_project_question_path %> <% end %>
  <%= render 'project_questions/pqps' %>

In my project_questions partial which is called _pqps, I have;

<div class="containerfluid">
  <div class="row">
    <div class="col-md-10 col-md-offset-1">

      <% f.simple_fields_for :project_questions, @project.project_questions.build do |f| %>
          <div class="categorytitle">
            <%= f.title %>
          </div>
          <div class="generaltext">
            <%= f.content %>
          </div>
          <%= render 'project_answers/show' %>
          <span class="editproject">   <% if current_user.id ==  @project.creator_id %>
            <%= link_to 'Answer this question', new_project_answer_path %>
              <% end %>
          </span>

      <% end %>
    </div>
  </div>
</div>

When I try this, I get an error that says:

undefined local variable or method `f' for #<#:0x0000010a11ce60>

I thought I was defining f at the beginning of the opening line of the _pqps form.

I'm really struggling to get a grip with coding. Can anyone see what I've done wrong?

2

There are 2 answers

2
shlajin On

You use f.simple_fields_for in pqps, but f is not defined anywhere. You have to define it using simple_form_for somewhere. I don't know exactly where – it depends on your own needs, but if, say, the whole form is inside _pqps:

<div class="containerfluid">
  <div class="row">
    <div class="col-md-10 col-md-offset-1">
      <%= simple_form_for @project do |f| %>
        <% f.simple_fields_for :project_questions, @project.project_questions.build do |f| %>
          # ...
        <% end %>
      <% end %>
    </div>
  </div>
</div>

If form "starts" outside "_pqps" partial, then you have to pass f as a local parameter:

<%= render 'project_questions/pqps', f: f %>
1
Airat Sirazutdinov On

projects_controller

def show
  @project_questions = @project.project_questions.build
end

View

<%= simple_form_for @project_questions do |f| %>
  <%= f.input :title%>
  <%= f.input :content %>
  <%= f.button :submit %>
<% end %>