Rails - Создание тега select из хеша объекта - PullRequest
16 голосов
/ 05 мая 2009

Мне нужно создать поле выбора из значений, доступных в хэше.

Например, у меня есть «вещь», а «вещь» имеет множество полей статуса:

1 => 'State A'
2 => 'State B'

доступно через метод на вещь.

Как я могу создать тег выбора из этого?

Ответы [ 4 ]

52 голосов
/ 05 мая 2009

Как сказал Шроквелл:

Hash.each |a| возвращает массив вида a = [key, value], поэтому для хэша @status_fields вы можете написать:

<%= collection_select('thing', 'status', @status_fields, :first, :last) %>

В качестве альтернативы, если вы хотите, чтобы ключ отображался в списке выбора, а значение указывает на значение списка выбора, то:

<%= collection_select('thing', 'status', @status_fields, :last, :first) %>

Это выберет параметр, заданный thing.status или ничего, если возвращается nil

Если вы хотите просто создать любое выделение, не привязанное к объекту, используйте

<%= select_tag('name', options_from_collection_for_select(@status_fields, :first, :last, '2')) %>

где '2' - индекс желаемого выбора

PS: У меня недостаточно репутации, чтобы просто изменить исходное сообщение или прокомментировать его

8 голосов
/ 05 мая 2009

вы могли бы сделать что-то вроде

select "foo", "bar", @hash_object

или

select "foo", "bar", @hash_object.map { |h| [h.key, h.value] }

Я бы, наверное, сначала инвертировал ваш хеш, чтобы указать ключ к значению

7 голосов
/ 05 мая 2009

метод выбора помощника примет хэш в форме { text_displayed_in_select => select_value }, поэтому вы, вероятно, захотите инвертировать этот хэш.


4 голосов
/ 05 мая 2009

Hash.each |a| возвращает массив вида a = [key, value], поэтому для хэша @status_fields вы можете написать:

<%= collection_select('thing', 'status', @status_fields, :first, :last) %>

Либо, если вы хотите, чтобы ключ отображался в списке выбора, а значение указывает на значение списка выбора, то:

<%= collection_select('thing', 'status', @status_fields, :last, :first) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...