Rails 2: используйте form_for для создания формы, охватывающей несколько объектов одного класса - PullRequest
2 голосов
/ 18 ноября 2010

Надеемся, что это данк для Rails maven:

У меня есть форма, которая должна перебирать набор LineItems и собирать информацию о каждом. Я пытаюсь заставить form_for и fields_for создать правильные имена полей и параметры, чтобы дать моему контроллеру хэш params что-то вроде

params[:line_items] = { <line_item.id> => { :rma_reason => "some string", :rma_qty => 2 } }

Что у меня есть:

<% form_for(@object) do |rma_form| %>
  <% @order.line_items.each do |item| %>
  ....
    <% fields_for item do |item_f| %>
      <%= item_f.text_area :rma_reason %>
      <%= item_f.text_field :rma_qty, :value => item.quantity, :size=>3 %>
    <% end %>
  ....
  <% end %>
<% end %>

И результирующий HTML выглядит так (как я и ожидал):

<textarea id="line_item_id" name="line_item[id]"></textarea> 
<input id="line_item_rma_qty" name="line_item[rma_qty]" size="3" type="text" value="1" />

Однако что я пытаюсь получить (и не могу найти никакого решения, кроме возврата к специальным HTML-тегам), это имена полей, которые индексируются line_item.id, например, line_item [1928] [rma_qty] например. Это позволило бы моему контроллеру перебирать каждый элемент line_item и обновлять его с заданными параметрами.

  • ... может быть, в чистом пользовательском интерфейсе REST форма должна быть привязана к ОДНОМУ экземпляру LineItem, и будет работать стандартная форма form_for, но пользователь должен иметь возможность отправить все изменения сразу с помощью одной формы. Возможно ли это?

Ответы [ 2 ]

1 голос
/ 18 ноября 2010

Когда вы вкладываете поля формы, вы должны убедиться, что вы соединяете методы fields_for с соответствующим построителем форм:

<% rma_form.fields_for :line_item, item do |item_f| %>

, вызвав только fields_for, вы разбилицепочка из form_for и, следовательно, неправильные имена полей.

0 голосов
/ 19 ноября 2010

fields_for должен вызываться в основном помощнике по форме, а также строковый параметр с магией [] s и аргумент, указывающий, какой экземпляр должен быть вставлен в [] s

<% rma_form.fields_for "line_item[]", item do |item_f| %>

так что теперь мой тег выглядит примерно так:

<input id="return_authorization_line_item_1070870205_rma_qty" name="return_authorization[line_item][1070870205][rma_qty]" size="3" type="text" value="1" />

персиковый.

this classic railscast - хорошее поле для вступления, а этот комментарий объясняет эффект магической скобки, которая сделала то, что я хотел - кроме этого, не смог найти эту функцию задокументировано где угодно.

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