2013-09-22 3 views
0

Я бегу Rails 4 на Рубине 2.0Получить имена ключей из ключевых пар значений

Я пытаюсь заполнить выберите тег с ключом массива значение пары у меня есть настройки в моей модели. Тем не менее, мне трудно понять, как захватить ключ. Вот то, что я до сих пор:

Модель

class Store 
    Colors = ['blue', 'green', 'red', 'yellow', 'orange', 'pink', 'purple', 'lime', 'magenta', 'teal'] 
    SearchParams = {'isbn' => 'ISBN', 'intitle' => 'Title', 'inauthor' => 'Author', 'inpublisher' => 'Publisher', 'subject' => 'Subject', 'lccn' => 'LCCN', 'oclc' => 'OCLC'} 
end 

Контроллер

def index 
    @search_params = Store::SearchParams.map { |param| [param, param.key] } 
end 

Примечание: Я знаю, что .key не существует - я добавил, что надеется, что это будет лучше сообщите, что я пытаюсь сделать.

Посмотреть

<%= form_tag do %> 
    <%= select_tag :param_name, @search_params, prompt: 'choose' %> 
<% end %> 

Я хотел бы значение каждого <option> быть ключом, и для пользователя, чтобы увидеть значение. Я надеюсь, что в этом есть смысл.

ответ

2

Вы вообще используйте options_for_select, чтобы предоставить опции для select_tag. Удобно, вы можете передать хэш для options_for_select, и он будет делать правильные вещи:

options_for_select (контейнер, выбранный = ноль)

Принимает контейнер (хэш, массив, перечислимы, ваш тип) и возвращает строку тегов параметров. [...]

Проблема заключается в том, что options_for_select хочет ключи хэша, чтобы быть то, что видит человек и ценности, чтобы быть value атрибуты для <option> с. Ваш Hash это назад, но вы можете использовать Hash#invert переворачивать ключи и значения вокруг:

инвертировать → new_hash

Возвращает новый хэш, созданный с помощью hsh «s значения как ключи и ключи, как значения.

Таким образом, вы можете просто сделать это в вашем контроллере:

@search_params = Store::SearchParams.invert 

, а затем это в Еврорадио:

<%= select_tag :param_name, options_for_select(@search_params), prompt: 'choose' %> 
+0

пригвоздил его - спасибо! – drewwyatt

1

Я думаю, это само по себе будет работать

индекс четкости @search_params = магазин :: SearchParams.to_a // он возвращает массив, который вы хотите, но значения будут [[key1, значение1], [key2, value2]] // если вы хотите отменить его, тогда Store :: SearchParams.to_a.collect {| arr | arr.reverse} даст, что КОНЕЦ

1

Это будет сделать это:

def index 
    @search_params = Store::SearchParams.map { |key, val| [val, key] } 
end 

UPD: Рассмотрим также Hash#invert (благодаря @mu слишком коротка)

+1

http://ruby-doc.org/core-2.0. 0/Hash.html # method-i-invert –

Смежные вопросы