Получить массив из формы Rails - PullRequest
6 голосов
/ 06 февраля 2012

Мне нужно создать форму для ресурса account. В этой форме мне нужно собрать некоторый набор идентификаторов в виде массива в хеше params в атрибуте с именем relationships.

Таким образом, окончательный хэш params[account] из запроса POST должен выглядеть так:

{:name => 'somename', :relationships => ["123", "23", "23445"]}

Как мне оформить form_for поля? Я попробовал это, но не сработало:

<%= form_for @account do |f| %>
    <%= f.text_field :name %>

    <% @eligible_parents.each do |p| %>
        <%= f.check_box "relationships", nil, :value => p.id  %>
        <b><%= p.name %></b><br/>
      </span>
    <% end %>

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

Количество элементов в @eligible_parents меняется каждый раз.

relationships не является ни ассоциацией, ни атрибутом в модели account.

Мне нужно использовать виртуальные атрибуты, но мне нужно заполнить массив из формы.

Пожалуйста, помогите. Как я могу это сделать?

Ответы [ 4 ]

6 голосов
/ 06 февраля 2012

Вам все еще нужен fields_for в вашем представлении, просто используйте :relationships в качестве record_name и укажите объект.

<%= form_for @account do |f| %>
    <%= f.text_field :name %>

    <% fields_for :relationships, @eligible_parents do |p| %>
        <%= p.check_box "relationships", nil, :value => p.object.id  %>
        <b><%= p.object.name %></b><br/>
    <% end %>

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

Документация здесь: ActionView :: Helpers ::FormHelper

2 голосов
/ 19 февраля 2015

Я нашел, что это самый чистый способ ...

Если вы работаете с прямыми данными и хотите отправить обратно массив, не используя ни один из этих @objects:

<%= form_for :team do |t| %>
  <%= t.fields_for 'people[]', [] do |p| %>
    First Name: <%= p.text_field :first_name %>
    Last Name: <%= p.text_field :last_name %>
  <% end %>
<% end %>

Ваши данные параметров должны возвращаться так:

"team" => {
  "people" => [
    {"first_name" => "Michael", "last_name" => "Jordan"},
    {"first_name" => "Steve", "last_name" => "Jobs"},
    {"first_name" => "Barack", "last_name" => "Obama"}
  ]
}
2 голосов
/ 06 февраля 2012

Если вы хотите отправить массив значений, просто используйте [] в атрибутах имени. В вашем случае просто используйте

<%= f.check_box "relationships", {}, :value => p.id, :name => "relationships[]"   %>
0 голосов
/ 22 марта 2019

В сложной форме с вложенными атрибутами вы можете использовать помощник f.object_name.Но остерегайтесь синтаксиса при выполнении интерполяции.Это правильно:

"#{f.object_name}[relationships][]"

Это НЕ правильно:

"#{f.object_name}[relationships[]]"

Это всегда сбивает меня с толку.

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