Em Sta
Em Sta

Reputation: 1696

Rails fields_for form not showing up, nested form

I have created an simple rails project. All worked fine until I tried to add a new model Paintings that belongs_to treatment and an Patient that has_many Paintings through Treatment. So somehow the nested form I created does not show up, I believe it has to do with the controller! Thanks, and greetings from Germany!

Treatments controller:

class TreatmentsController < ApplicationController
  def create
    @patient = Patient.find(params[:patient_id])
    @treatment = @patient.treatments.create(params[:treatment])
    redirect_to patient_path(@patient)
  end

  def destroy
    @patient = Patient.find(params[:patient_id])
    @treatment = @patient.treatments.find(params[:id])
    @treatment.destroy
    redirect_to patient_path(@patient)  
  end
end

And the form for treatments with nested fields_for that doesn't show up:

<%= form_for([@patient, @patient.treatments.build]) do |f| %>
  <div class="field">
    <%= f.label :content %>
    <%= f.text_area :content, :cols => "30", :rows => "10" %>
  </div>
  <div class="field">
    <%= f.label :category_id %>
    <%= f.collection_select :category_id, Category.find(:all), :id, :typ %>
  </div>

  <%= f.fields_for :paintings do |ff| %>
    <div class="field">
      <%= ff.label :name, 'Tag:' %>
      <%= ff.text_field :name %>
    </div>
  <% end %>

  <div class="field">
    <%= f.submit nil, :class => 'btn btn-small btn-primary' %>
  </div>
<% end %>

UPDATE:

Show Site:

<% @patient.treatments.each do |treatment| %>
  <tr>
    <td><%= treatment.category.try(:typ) %></td>
    <td><%= treatment.content %></td>
    <td><%= treatment.day %></td>
    <td><div class="arrow"></div></td>
  </tr>
  <tr>

Upvotes: 27

Views: 21668

Answers (5)

Alter Lagos
Alter Lagos

Reputation: 12540

Dumb error, but I was using:

<% f.fields_for :partner do |fp| %>

instead of:

<%= f.fields_for :partner do |fp| %>

Upvotes: 10

is case you have an association where it is optional:

in the controller:

@associated_model = @model.associated_model || @model.build_associated_model

in the view:

<%= form.fields_for :associated_model do |am| %>

Upvotes: 0

Mike Szyndel
Mike Szyndel

Reputation: 10593

Try doing following in new action in controller

@patient.treatments.build

Check out build_association part http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to

You should also read about nested attributes. Use those for reference http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

Upvotes: 11

Aleks
Aleks

Reputation: 5320

Even the question is quite old, but you are missing the new that is crucial to this question. The methods destroy and create doesn't have anything with this issue. If you have a new method, which looks something like this:

class TreatmentsController < ApplicationController
  def new
    @patient = Patient.new
  end
end

Then the solution would be do modify the new method to "build" the paintings like this:

class TreatmentsController < ApplicationController
  def new
    @patient = Patient.new
    @patient.paintings.build
  end
end

Upvotes: 17

Prasad Surase
Prasad Surase

Reputation: 6574

Please try

= f.fields_for :paintings, Painting.new do |p|

Upvotes: 82

Related Questions