2009-02-09 3 views
2

У меня есть поле выбора, который выглядит следующим образом (в form_for)select_tag сортировка (странно) [Rails]

<%=f.select(:whatever_id, {"blah"=>0, "blah2"=>1, "blah3"=>2, "blah4"=>3}, {:include_blank => true}) %> 

и выход хорошо, но странно ... как это:

<select id="personal_information_whatever_id" name="personal_information[whatever_id]"><option value=""></option> 
<option value="1">blah2</option> 

<option value="2">blah3</option> 
<option value="0">blah</option> 
<option value="3">blah4</option></select> 

Но я хочу, чтобы он пришел в порядок ... Что происходит, и как я могу его исправить?

Edit: Я чувствую, что ответ должен делать с этим

Вы никогда не можете быть гарантированы любым порядка с хэш. Вы можете попробовать .sort() для сортировки значений в в алфавитном порядке.

Есть ли что-нибудь, что я могу использовать в стороне от хэша?

ответ

9

Да, вы должны использовать массив массивов. Самый простой способ с вашим примером будет примерно таким:

<%=f.select(:whatever_id, [["blah", 0], ["blah2", 1], ["blah3", 2], ["blah4", 3]], {:include_blank => true}) %> 

Этого должно быть достаточно. Взгляните на документы на api.rubyonrails.com тоже.

+0

Отлично. Только то, что мне было нужно. БЛАГОДАРЮ. –

+0

Но синтаксис хэша выглядит так сексуально! хаха спасибо. –

+0

@Jon Я не знаю, шутите ли вы, и я знаю, что вы никогда не увидите этого, потому что он не отображается в ваших ответах, но: Мне не нравится этот глупый синтаксис хеширования. Мне просто неловко печатать. Но это работает, поэтому ... –

0

Проблема в том, что параметр options является хешем, а хеши не имеют гарантированного порядка.

Это должно работать для вас

<%= f.select(:whatever_id, ([["blah",0],["blah2",1],["blah3",2]]), {:include_blank => true}) %> 

Редактировать в ответ на Ваш комментарий: Для коллекции см collection_select

+0

прохладный, спасибо HermanD. Я просто набрал это :) Любые легкие обходные пути с точки зрения коллекций? –

2

В вашей модели, определить свой хэш (в вашем случае, если ваша модель «все» и ваш хэш «вздор»):

BLAHS = { "blah"=>0, "blah2"=>1, "blah3"=>2 }

В выберите тег, где вы положили ваш хэш, тип

Whatever::BLAHS.sort {|a,b| a[1] <=> b[1]} 

Это создает массив, как описано в других ответах, упорядочивается по второму пункту (id/numbers).

После сохранения, когда вы тянуть Безотносительно обратно из базы данных и хотите, чтобы показать поле мля, это сделать

Whatever::BLAHS.index whatever.blah 

Массив массивов, упомянутых других работ, но если вы хотите, чтобы показать Как бы то ни было, как вы хорошо представляете ценность блаха? Я рекомендую придерживаться хеша, поскольку он решает эту проблему.