повторно использовать встроенную форму в своем контроллере - PullRequest
1 голос
/ 16 сентября 2010

Я следовал руководству по краям рельсов при создании простого приложения для рецептов, и сейчас я пытаюсь разветвляться и делать еще несколько интересных вещей, чтобы попытаться узнать больше о рельсах.

Скореея мог подумать, что было бы не просто отредактировать ингредиент во встроенной форме, а перейти на страницу рецепта /: recipe_id / ингридиент /: ингридиент_ид / редактировать и обновить там ингредиент.

Однако часть формы, которую я использую для редактирования ингредиента, вложена в форму рецепта.поэтому он начинается с

<%= 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 %>
&lt% end %>

Это вызывается из recipes / show.html.erb

<%= render @recipe.ingredients %>

То, что я сейчас пытаюсь сделать, - это возможность вызывать ту же форму из ингридиентов / edit.html.erb

<%= render @ingredients %>

, поскольку ингредиенты не имеют контекста рецепта из контроллера ингредиентов.

Есть ли лучший способ связать ингредиенты с рецептами?Я только сейчас понимаю, что это на самом деле не вложенная форма, за исключением того, что она вызывается со страницы рецепта.

1 Ответ

2 голосов
/ 16 сентября 2010

У вас есть

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

, который является маршрутом для редактирования существующего ингредиента.Но ваша форма

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

ожидает, что вы создадите новый ингредиент, который принадлежит @ recipe.

Если вы хотите отредактировать существующий ингредиент, вам нужно получить его, используя ваши параметры.

@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 -%>

На самом деле, вы можете опубликовать суть вашей формы, как указано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...