4


3

ビューでfields_forを使用するRails 3は機能しません

fields_forを使用して、railsフォームにマスター詳細を実装しようとしています。

レシピという1つのモデルがあります。

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

  has_many :recipe_ingredients
end

そして、RecipeIngredientと呼ばれる1つのモデル:

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

新しいコントローラーでは、次のように3つの空のレコードを成分に追加します。

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

ビューでやりたいことは、レシピフィールド(正常に機能します)と、レシピの材料の3つのフィールドを出力することです。 ビューの上部にこれがあります:

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

次に、次のように正しく表示されるレシピフィールドをリストします。

    <%= f.label :name %>

    <%= f.text_field :name %>

次に、成分の行を表示しようとしますが、コードがfields_forセクションに入らないようです:

初挑戦:

<% for ingredient in @recipe.recipe_ingredients %>
    This prints out three times
    <% fields_for "...", ingredient do |ingredient_form| %>
      But this never prints out

      Ingredient: <%= ingredient_form.text_field :description %>

    <% end %>
  <% end%>

recipe_ingredientsに3つの空の行があり、forループが3回繰り返されるようですが、fields_for内のコードはトリガーされません。

2回目の試行:

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

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

3回目の試行(ここでの回答に基づいて):

<% form_for :recipe do |f| %>
    <% f.fields_for ingredients do |ingredient_form| %>

      Ingredient: <%= ingredient_form.text_field :description %>

    <% end %>
<% end %>

私が間違っていることは明らかですか?

2 Answer


27


  • form_for および fields_for を使用する場合は、<%ではなく <%= *を使用する必要があります

正しいコードは次のようになります。

<%= form_for :recipe do |f| %>
    <%= f.fields_for :ingredients do |ingredient_form| %>

      Ingredient: <%= ingredient_form.text_field :description %>

    <% end %>
<% end %>


5


に切り替える

<% form_for :recipe do |f| %>
    <% f.fields_for :ingredients do |ingredient_form| %>

      Ingredient: <%= ingredient_form.text_field :description %>

    <% end %>
<% end %>