Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails 3 using fields_for in view doesn't work

I'm trying to implement master detail in a rails form with fields_for.

I have one model called Recipe:

class Recipe < ActiveRecord::Base
  validates :name,  :presence => true
  validates :directions, :presence => true

  has_many :recipe_ingredients 
end

and one model called RecipeIngredient:

class RecipeIngredient < ActiveRecord::Base
  belongs_to :recipe
  #belongs_to :ingredient
end

In the new controller I populate the ingredients with three empty records like this:

def new
    @recipe = Recipe.new
    3.times {@recipe.recipe_ingredients.build}
    # @ingredients = RecipeIngredient.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @recipe }
    end
  end

What I would like to do in the view is to output the recipes fields (which works ok) and the three fields for recipe ingredients. In the top part of the view I have this:

<%= form_for :rec do |f| %>

I then list the recipe fields which are displayed correctly, like:

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>

I then try to display the ingredient lines but the code never seems to go into the fields_for section:

first try:

<% for ingredient in @recipe.recipe_ingredients %>  
    This prints out three times
    <% fields_for "...", ingredient do |ingredient_form| %>  
      But this never prints out
      <p>  
      Ingredient: <%= ingredient_form.text_field :description %>  
      </p>  
    <% end %>  
  <% end%>  

I have three empty lines in recipe_ingredients and the for loop seems to iterate three times but the code within fields_for never triggers.

Second try:

  <% for recipe_ingredient in @recipe.recipe_ingredients %>
    b

    <% fields_for "...", recipe_ingredient do |recipe_ingredient| %>
      Rec: <%= recipe_ingredient.text_field :description %>
    <% end %>
  <% end %>

Third try (based on the answer here):

<% form_for :recipe do |f| %>
    <% f.fields_for ingredients do |ingredient_form| %>  
      <p>  
      Ingredient: <%= ingredient_form.text_field :description %>  
      </p>  
    <% end %> 
<% end %>

Is there something obvious I'm doing wrong?

like image 354
gugguson Avatar asked Nov 27 '22 06:11

gugguson


1 Answers

You should use <%= instead of <% when using form_for and fields_for

The correct code should look like this:

<%= form_for :recipe do |f| %>
    <%= f.fields_for :ingredients do |ingredient_form| %>  
      <p>  
      Ingredient: <%= ingredient_form.text_field :description %>  
      </p>  
    <% end %> 
<% end %>
like image 112
Phillipe Gustavo Avatar answered Dec 23 '22 22:12

Phillipe Gustavo