Как настроить форму для хэша в Rails? - PullRequest
9 голосов
/ 23 сентября 2011

У меня есть некоторые данные, связанные с моделью в хэше. Хеш генерируется в контроллере: @hash.

Как правильно создать форму для этих данных?

Я придумал следующий код для представления:

  <% @hash.keys.each do |key| %>
    <div class="field">
      <%= f.label key %><br />
      <%= text_field_tag "hash_" + key, @hash[key] %> 
    </div>
  <% end %>

Формирует форму, но создает каждый хеш-элемент в виде отдельной переменной в форме. Похоже, это неправильный способ отправить данные обратно. Я хотел бы вернуть данные в виде хэша и получить к ним доступ с помощью params[:hash].

Каков наилучший способ сделать это?

Работа в Rails 3.07, Ruby 1.9.2.

Спасибо.

РЕДАКТИРОВАТЬ: Я должен был сделать это ясно. Этот код находится внутри формы, сгенерированной для модели. Таким образом, форма должна предоставить все поля для модели, плюс вышеуказанный хеш.

Ответы [ 3 ]

12 голосов
/ 23 сентября 2011

На основании этой статьи вы должны изменить имя в text_field_tag ​​на

<% @hash.keys.each do |key| %>
  <div class="field">
    <%= f.label key %><br />
    <%= text_field_tag "hash[" + key + "]", @hash[key] %> 
  </div>
<% end %>
2 голосов
/ 23 сентября 2011

Мой ответ не строго по теме, но я действительно рекомендую вам взглянуть на http://railscasts.com/episodes/219-active-model. Вы можете использовать API ActiveModel для моделирования объекта модели с помощью Rails 3. Для этого вы можете просто сделать что-то вроде

<%= form_for(@object) %>

и оставляя заполнение вашего объекта на Rails API.

0 голосов
/ 23 сентября 2011

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

Вместо text_field_tag ... используйте f.text_field ....

Чтобы получить хеш, подобный params => {:hash => {:field1 => "", :field2 => ""}}, вам нужно соединить form_for с f.input_field_type вместо простого input_field_tag.

Видите разницу?

...