0

我有一个多对多关系的配方和成分。

我在演示文稿中定义了以下命令。

<div>
  <%= render :partial => 'ingredients/form',
             :locals => {:form => recipe_form} %>
</div>

部分以

<%= form_for(@ingredient) do |ingredient_form| %>

但收到@ingredient nill。然后我尝试了

<%= recipe_form.fields_for :ingredients do |builder| %>
    <%= render 'ingredient_fields', f: builder %>
<% end %>

我的渲染在哪里

<p class="fields">
  <%= f.text_field :name %>
  <%= f.hidden_field :_destroy %>
</p>

但没有打印任何内容。然后我尝试了

<% @recipe.ingredients.each do |ingredient| %>
    <%= ingredient.name %>
<% end %>

只有这样所有的成分都被打印出来了。我在以前的尝试中做错了什么?谢谢你。

我的配料配方关系定义如下

 class Ingredient < ActiveRecord::Base
   has_many :ingredient_recipes
   has_many :recipes, :through => :ingredient_recipes
   ...

 class Recipe < ActiveRecord::Base
   has_many :ingredient_recipes
   has_many :ingredients, :through => :ingredient_recipes
   ...

   accepts_nested_attributes_for :ingredient_recipes  ,:reject_if  => lambda { |a| a[:content].blank?}


 class IngredientRecipe < ActiveRecord::Base
  attr_accessible :created_at, :ingredient_id, :order, :recipe_id
  belongs_to :recipe
  belongs_to :ingredient
 end
4

1 回答 1

1

您没有具体说明您要做什么,所以我假设您有一个显示食谱的页面,其中包含许多可以编辑和添加的成分。在您的控制器中,您有类似的东西:

class RecipeController < ApplicationController
  def edit
    @recipe = Recipe.find(params[:id]
  end
end

我还假设您正在寻找一个回发到创建操作的表单。因此,我认为您想要这样的表格:

<%= form_for @recipe do |form| %>

  <%= label_for :name %>
  <%= text_field :name %>

  <%= form.fields_for :ingredients do |ingredients_fields| %>
    <div class="ingredient">
      <%= f.text_field :name %>
      <%= f.hidden_field :_destroy %>
    </div>
  <% end %>

<% end %>

此外,更改您的配方以接受嵌套属性ingredients,而不是ingredient_recipes

class Recipe < ActiveRecord::Base
   has_many :ingredient_recipes
   has_many :ingredients, :through => :ingredient_recipes
   ...

   accepts_nested_attributes_for :ingredients, :reject_if  => lambda { |a| a[:content].blank?}

最后,为您的内容添加 attr_accessible:

class Ingredient < ActiveRecord::Base
  attr_accessible :content
  ...

那对你有用吗?

于 2012-06-15T23:02:25.470 回答