我正在尝试使用以下字段创建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和其他一些表之间的连接表)。但是,当我提交参数时,如何在代码中区分哪些参数属于哪个类?
答案 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 recipies
和Recipie 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