2010-09-25 2 views
4

Я пытаюсь реализовать главную деталь в форме рельсов с полями_for.Rails 3 using fields_for in view не работает

Я одна модель под названием Рецепт:

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

    has_many :recipe_ingredients 
end 

и одна модель под названием RecipeIngredient:

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

В новом контроллере я заполнить ингредиенты с тремя пустыми записями, как это:

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 

Что бы я хотел сделать в представлении, это вывести поля рецептов (которые работают s ok) и три поля для ингредиентов рецепта. В верхней части представления у меня есть это:

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

Я тогда список полей рецептов, которые отображаются правильно, как:

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

Затем я стараюсь не показывать ингредиентов строки, но код никогда кажется, идет в fields_for раздел:

первый попробовать:

<% 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%> 

у меня есть три пустые строки в recipe_ingredients и цикл for, похоже, повторяются три раза, но код внутри полей не запускается.

Вторая попытка:

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

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

Третья попытка (на основе ответа здесь):

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

Есть ли что-то очевидно, что я делаю неправильно?

ответ

5

Переключить его до

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

Спасибо за t он отвечает. У меня это выше: <% = form_for (@recipe) do | f | %> При попытке вашего кода я получаю следующую ошибку: неопределенная локальная переменная или метод 'components 'для # <# <Класс: 0x00000101e9fd20>: 0x00000101e9b900> – gugguson

+0

@gugguson - у меня были« ингредиенты », но означало«: ингредиенты "- ингредиенты символа скажут form_for (рецепт), чтобы вызвать массив ингредиентов. –

+0

Отлично - это сработало. Спасибо за помощь. Небольшой вопрос: как я могу использовать его в представлении «Показать»? – gugguson

27

Вы должны использовать <% = вместо <% при использовании form_for и fields_for

Правильный код должен выглядеть следующим образом:

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

Я не мог понять, почему мой код не работал. Только когда я положил <% =, он начал работать. Так что спасибо! :) –

+0

+1 Спасибо, это просто спасло мне некоторые головные боли. –

+0

Однако в Rails 2 вы не должны использовать знак равенства. Я не могу найти источник из документации Rails, но вот некоторые ссылки, чтобы продемонстрировать других, которые столкнулись с этим для Rails 2 http://ruby.railstutorial.org/chapters/sign-up#sec-using_form_for и http://stackoverflow.com/questions/9459002/getting-fields-for-to-work-with-has-many-relationship – KDP

Смежные вопросы