在form_for Rails中使用多个类

时间:2012-02-21 23:36:06

标签: html ruby-on-rails forms model-view-controller class

我正在尝试使用以下字段创建form_for。但是,某些字段对应于一个模型,RecipeIngredient类(模型),而底部字段对应于Recipe类(模型)。

  <%= form_for(:recipe_and_ingredients, :url => {:action => 'create'}) do |f| %>

<!-- RecipeIngredient classs -->
<table>
<tr>
 <td>4</td>
 <td><%= f.text_field(:quantity) %></td>
 <td><%= f.text_field(:weight) %></td>
 <td><%= f.text_field(:units) %></td>
</tr>
</table> 


<!-- Recipe class -->
<table summary="Recipe form fields">
  <tr>
    <th>Recipe Name</th>
    <td><%= f.text_field(:recipe_name) %></td>
    <th>Total Grams</th>
    <td><%= f.text_field(:total_grams) %></td>
  </tr>
</table>

<div class="form-buttons">
  <%= submit_tag("Create Recipe") %>
</div>

<% end %>

然而,在我的控制器中:

 # Instantiate a new object using form parameters
  @recipe = Recipe.new(params[:recipe_and_ingredients])
  @ingredient = RecipeIngredient.new(params[:recipe_and_ingredients])

我提交表单时出现此错误

  unknown attribute: quantity

我知道这是因为Recipe模型/ class / table /什么都没有数量列;这是RecipeIngredient中的一个列(如果相关,它应该是Recipe和其他一些表之间的连接表)。但是,当我提交参数时,如何在代码中区分哪些参数属于哪个类?

2 个答案:

答案 0 :(得分:1)

使用 在模型中:accepts_nested_attributes_for
在控制器中:什么都没有 在路线:没有什么 在视图中,在您想要“嵌套”字段的位置,使用f.fields_for :other_model do |inner|,然后您可以使用inner.inner_field_name。我认为内在将是你的情况下的成分,如果那是RecipieIngredient,你将它重命名为成分。如果receiptieIngredient实际上是一个更复杂的连接表重做,则需要。

http://railscasts.com/episodes/196-nested-model-form-part-1

了解详情

我会为实体的“收件人”和“成分”命名,然后为具有fields_for :ingredients do |i|的收件人创建一个表单。

如果您想要Ingredient has_many recipiesRecipie has_many ingredients,您也可以在两个模型中使用has_many_through来执行此操作,这两个模型都指向属于“收件人”和“成分”的联接模型IngredientRecipie但这不会影响表格。这些关系用于检索数据。

请注意,如果您拥有这些has_many,则可以使用simple_form来维护与关系复选框的关系,除了通过一次保存保存数据之外,不需要编写其他代码。

更新

Recipie (model)
Recipie has_many :recipie_ingredients
Recipie has many :ingredients, :through => :recipie_ingredients

Ingredient (model)
Recipie has_many :recipie_ingredients
Recipie has many :ingredients, :through => :recipie_ingredients

RecipieIngredient (model)
belongs_to :recipies
belongs_to :ingredients

答案 1 :(得分:1)

有两种方法可以解决这个问题。

第一种是使用ActiveRecord委托将子模型的属性放在父模型上。您可以在此处查看有关如何执行此操作的文档:http://api.rubyonrails.org/classes/Module.html#method-i-delegate

其次,您可以使用嵌套表单使此表单的一部分属于不同的模型对象。您可以在此处查看相关文档:http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html