2010-09-25 5 views
4

J'essaye d'implémenter le détail principal sous forme de rails avec fields_for.Rails 3 en utilisant fields_for in view ne fonctionne pas

J'ai un modèle appelé recette:

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

    has_many :recipe_ingredients 
end 

et un modèle appelé RecipeIngredient:

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

Dans le nouveau contrôleur je remplir les ingrédients avec trois dossiers vides comme celui-ci:

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 

Ce que je voudrais faire dans la vue est de sortir les champs de recettes (qui fonctionnent ok) et les trois champs pour les ingrédients de la recette. Dans la partie supérieure de la vue que j'ai ceci:

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

Je puis énumérer les champs de recettes qui sont correctement affichés, comme:

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

J'essaie alors d'afficher les lignes d'ingrédients, mais le code ne semble aller dans la section fields_for:

premier essai:

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

Je trois lignes vides dans recipe_ingredients et la boucle for semble itérater trois fois mais le code dans fields_for ne se déclenche jamais.

Deuxième essai:

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

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

essayer troisième (basé sur la réponse ici):

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

Y at-il quelque chose d'évident que je fais mal?

Répondre

5

commutateur il jusqu'à

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

Merci pour le t il répond. J'ai ceci ci-dessus: <% = form_for (@recipe) do | f | %> Lorsque j'essaye votre code j'obtiens l'erreur suivante: variable locale non définie ou méthode 'ingrédients 'pour # <# : 0x00000101e9b900> – gugguson

+0

@gugguson - J'avais" ingrédients "mais signifiait": ingrédients "- les ingrédients du symbole diront à la forme_pour (recette) d'appeler le tableau des ingrédients. –

+0

Super - cela a fonctionné. Merci de votre aide. Petite question: Comment pourrais-je l'utiliser dans la vue Afficher? – gugguson

27

Vous devez utiliser <% = au lieu de <% lors de l'utilisation form_for et fields_for

devrait ressembler le bon code ceci:

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

Je ne pouvais pas comprendre pourquoi mon code ne fonctionnait pas. Ce n'est que lorsque j'ai mis <% = que ça a commencé à fonctionner. Donc merci! :) –

+0

+1 Merci, cela m'a juste sauvé quelques maux de tête. –

+0

Toutefois, dans Rails 2, vous ne devez pas utiliser le signe égal. Je ne trouve pas la source à partir de la documentation de Rails, mais voici quelques liens pour en démontrer d'autres qui ont rencontré Rails 2 http://ruby.railstutorial.org/chapters/sign-up#sec-using_form_for et http://stackoverflow.com/questions/9459002/getting-fields-for-to-work-with-has-many-relationship – KDP