Вложенные атрибуты Rails неправильно вставляют идентификатор

Я пытаюсь отредактировать вложенные атрибуты модели, как описано здесь, воспроизведенное здесь:

    <%= form_for @person do |person_form| %>
      <%= person_form.text_field :name %>
      <% for address in @person.addresses %>
        <%= person_form.fields_for address, :index => address do |address_form|%>
          <%= address_form.text_field :city %>
        <% end %>
      <% end %>
    <% end %>

В моем коде у меня есть следующее:

<%= form_for(@meal) do |f| %>
  <!-- some other stuff that's irrelevant... -->

      <% for subitem in @meal.meal_line_items %>
         <!-- # Edit 2: I need to display information here about the subitem
              Which I can't find a way to pass it to the partial, or work in 
              this manner for existing items
         -->
         <%= subitem.food.name %>
         <%= subitem.food.calories %>

         <%= f.fields_for subitem, :index => subitem do |line_item_form| %>
            <%= line_item_form.label :servings %><br/>
            <%= line_item_form.text_field :servings %><br/>
            <%= line_item_form.label :food_id %><br/>
            <%= line_item_form.text_field :food_id %><br/>
         <% end %>
      <% end %>

      <%= f.submit %>
<% end %>

Это прекрасно работает, за исключением того, что когда я смотрю на HTML, он создает входные данные, которые выглядят следующим образом, не введя правильный идентификатор и вместо этого помещая представление памяти (?) модели. В результате обновление не выполняется:

<input type="text" value="2" size="30" name="meal[meal_line_item][#<MealLineItem:0x00000005c5d618>][servings]" id="meal_meal_line_item_#<MealLineItem:0x00000005c5d618>_servings">

EDIT: Причина, по которой я пытаюсь сделать это в этом методе, заключается в том, что мне нужно собрать некоторую информацию об ассоциациях для существующих food_line_items. Например, в области, где я вынул код, у меня есть некоторый код для эффекта:

<%= subitem.food.name %>
<%= subitem.food.calories %>

Получение этой информации не сработает, если я использую построитель форм с частичными элементами, по крайней мере, не в своих испытаниях.

Правка 2:* См. правку в коде. Вот мой MealLineItem

class MealLineItem < ActiveRecord::Base
  # Associations ---------------------
  belongs_to :food
  belongs_to :meal
end

И еда принимает_вложенные_атрибуты для своей модели. Как видите, это относится как к еде, так и к модели еды. Для существующего объекта food_line_item мне нужно сделать что-то вроде:

meal_line_item.food.name

person MunkiPhD    schedule 05.01.2011    source источник


Ответы (3)


f. отсутствует в <%= fields_for?

--редактировать

Ты пытался:

<%= f.fields_for 'meal[meal_line_item][]', subitem do |line_item_form| %>

--редактировать

Документы говорят, что он должен работать и без цикла:

<%= form_for(@meal) do |f| %>
  <!-- some other stuff that's irrelevant... -->

  <%= f.fields_for :meal_line_items do |line_item_form| %>
    <%= line_item_form.label :servings %><br/>
    <%= line_item_form.text_field :servings %><br/>
    <%= line_item_form.label :food_id %><br/>
    <%= line_item_form.text_field :food_id %><br/>
  <% end %>

  <%= f.submit %>
<% end %>
person Heikki    schedule 05.01.2011
comment
Я пропустил копирование f. при копировании кода из-за разных вещей :( - person MunkiPhD; 05.01.2011
comment
Неа. Для справки, без ф. входы по существу не указывают, что они являются частью «Еды», и заканчиваются следующим идентификатором: food_line_item_#‹MealLineItem:0x00000005c5d618›_servings - person MunkiPhD; 05.01.2011
comment
Выдает `@meal[meal[meal_line_item]' в качестве имени переменной экземпляра. - person MunkiPhD; 05.01.2011
comment
Это сработает, но дело в том, что это не решит мою проблему. Должно быть, я неправильно написал свою первоначальную проблему. Дело в том, что мне нужно отобразить информацию, основанную на ассоциации с food_line_item для тех, которые уже существуют. См. редактирование 2. Спасибо за помощь! - person MunkiPhD; 05.01.2011

Нужно проверить это, но, может быть, этот подход?

_форма

<%= form.fields_for :meal_line_items do |meal_line_item_form| %>
 <% @meal.meal_line_items.each do |meal_line_item| %>
  <%= render :partial => "meal_line_items/meal_line_item", :locals => { :meal_line_item_form => meal_line_item_form, :meal_line_item => meal_line_item } %>
 <% end %>
<% end %>

food_line_items/_meal_line_item.erb

<%= meal_line_item_form.label :servings %><br/>
<%= meal_line_item_form.text_field :servings %><br/>
<%= meal_line_item_form.label :food_id %><br/>
<%= meal_line_item_form.text_field :food_id %><br/>

ИЗМЕНИТЬ

вот ссылка на пример прямой установки итератора форм (однако Rails 2.3.8). Связи между Вспышка -> Инциденты -> Местоположение должны быть такими же, как и для Приема пищи -> Предметы_линии_приема пищи -> Еда.

Обновление AJAX для accepts_nested_attributes_for partials

person Pasted    schedule 05.01.2011
comment
Если я сделаю так, как вы сказали, я получаю NameError, когда пытаюсь использовать информацию из food_line_item в частичном, говоря, что есть неопределенная локальная переменная, даже если имя передаваемого локального объекта такое же, как и в частичном. - person MunkiPhD; 05.01.2011
comment
У моделей есть такая ассоциация? извините за форматирование... Еда has_many: food_line_items accepts_nested_attributes_for :meal_line_item :::::: Meal_line_item принадлежит_к: еда - person Pasted; 05.01.2011
comment
Да, но food_line_item также принадлежит food. Поэтому, когда я хочу посмотреть на продукт питания через ассоциацию с этим пунктом меню, я не могу заставить его работать в партиале. Возможно, я неправильно передаю переменные, но код, который вы разместили, не работал у меня ни с местными жителями, ни с любым другим методом, который я пробовал. - person MunkiPhD; 05.01.2011
comment
Добавлена ​​ссылка на страницу с прямой настройкой итератора Formbuilder, хотя там много отступов. Вероятно, это излишне, если только вам не нужно было добавлять food_line_items через ajax-вызовы (и даже в этом случае должен быть лучший способ сделать это). - person Pasted; 05.01.2011
comment
Это не столько добавление элементов через ajax - это работает правильно. Он отображает элементы, которые уже существуют. Код, который вы изначально опубликовали для выполнения fields_for, а затем цикла внутри, по существу отображает код дважды, поскольку это двойной цикл for. - person MunkiPhD; 05.01.2011

После поиска вверху и внизу я нашел ошибку. Хотя я модифицировал частичное и получал NameError, это потому, что я вызывал частичное из вспомогательного метода - точно такая же проблема, как указано в следующем вопросе:

rails fields_for частичного рендеринга с несколькими локальными переменными, создающими неопределенную переменную

person MunkiPhD    schedule 05.01.2011