在自己的控制器中重用嵌入式表单

时间:2010-09-15 20:29:51

标签: ruby-on-rails

我一直在关注rails edge guide来构建一个简单的配方应用程序,我现在正在尝试分支并做一些有趣的事情来尝试更多地了解rails。

我认为可能只需要去配方/:recipe_id / ingredient /:ingredient_id / edit页面并更新那里的成分,这样就可以编辑嵌入式表格中的成分了。

但是,我用于编辑成分的表格部分嵌套在配方表格中。 所以它从

开始
<%= form_for([@recipe, @recipe.ingredients.build]) do |f| % >

编辑页面知道什么食谱,但它真正想要的是成分。但是,如果我将@recipe更改为@ingredient,则此相同的表单在配方控制器中不起作用。

我很确定我不应该使用相同的字段制作两个单独的表单来执行此操作。

--------关于表单部分和路由看起来像什么的更多数据-------- 配方和完整的嵌入式表格成分是

< form_for([@recipe, @recipe.ingredients.build]) do |f| %>
   <%= f.label :ingredient %>
   <%= f.text_field :ingredient %>

  <%=f.label :amount %>
  <%=f.text_field :amount %>
<% end %>

这是从recipes / show.html.erb

调用的
<%= render @recipe.ingredients %>

我现在要做的是能够从ingredients / edit.html.erb调用相同的表单

<%= render @ingredients %>

因为配料没有配料控制器内配方的背景。

有没有更好的方法将食材连接到食谱?我现在才意识到这不是一个嵌套的表单,除了从配方页面调用它。

1 个答案:

答案 0 :(得分:2)

你有

/recipe/:recipe_id/ingredient/:ingredient_id/edit

这是编辑现有成分的路线。但是你的表格

<%= form_for([@recipe, @recipe.ingredients.build]) do |f| % >

期待你建立属于@recipe的新成分。

如果您想要编辑现有成分,那么您需要使用params来获取它。

@recipe = Recipe.find params[:recipe_id]
@ingredient = @recipe.ingredients.find params[:ingredient_id]
<%= form_for([@recipe, @ingredient]) do |f| % >    

我真的不知道你关注的是什么样的例子,但我想一个成分是食谱和(比如说)食物之间的多对多联合?如果是这种情况,并且配料属于配方而不是许多配方,那么您可以这样做:

/ingredient/:ingredient_id/edit
@ingredient = Ingredient.find params[:ingredient_id]
@recipe = @ingredient.recipe

因此:

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

进一步的建议:

我不能肯定地说没有看到你所有的模板,但你做的是:

<%- form_for @item do |f| -%>
  <%= f.fields_for :field -%>

 <%- form_for @different_item do |ff| -%>
   <%= ff.fields_for :another_field  -%>
 <%- end -%>

<%- end -%>

实际上,您是否可以按上述方式发布表格的要点。