Select w widoku i pętla

Witam wszystkich,

mam sobie taki kawałek kodu:

  <%= d.select :floors, options_for_select({"--wybierz --" => 0, 1 => 1 , 2 => 2, "pow. 2" => 3}, "-- wybierz --") %>

to w przeglądarce wygląda to tak:

[code]

pow. 2 1 2 --wybierz -- [/code] i w związku z tym mam 2 pytania: 1. Jeżeli w powyższym wypadku będzie więcej opcji wyboru niż 3 to będę musiał się trochę namęczyć by wpisać je wszystkie, jak w widoku zrobić pętle by generowały mi się optionsy wg. powyższego schematu - 1 option jest domyślny i nie jest int, ostatni option nie jest int, pozostałe są integerami.
  1. Czemu mam tak dziwnie posortowaną tą listę? Jak zrobić by posortowane było wg “indexów”?

Jeśli masz jakiś model przechowujący informacje o tych możliwych wartościach dla tego selecta to użyj collection_select

modelu żadnego nie ma chciałbym uzyskać efekt na wzór tego:

[code]echo ’

-- wybierz --';

for ($i=0; $i<20; $i++){
echo ‘’.$i.’</option’;
}

echo ’

pow. 20 ';[/code] sorry za php'a ale najłatwiej w tym było mi to zobrazować - tu nie potrzeba modelu do zwykłej pętli z kolejnymi wartościami dlatego wydaje mi się, że najlepiej było by to zrobić w widoku.

od biedy zadziała

Widok

<%= f.select :floors, options_for_select(make_tag_select_for(20), 0) %>

Helper

[code] def make_tag_select_for( fields_size )
fields = (0…fields_size).to_a
fields.collect! { |n| [n,n] }

fields[0][0] = “–wybierz–”
fields[fields_size][0] = “pow #{fields_size - 1}”

fields
end[/code]

dzięki, super działa :slight_smile:

i jeszcze prosiłby, o odpowiedź na moje drugie pytanie, mając np. taki kod:

<%= f.select :available, options_for_select({"-- brak danych --" => 0, "do uzgodnienia" => 1, "natychmiast" => 2, "data..." => 3}, 0) %>

czemu “-- brak danych --” jest na drugiej pozycji a nie na pierwszej, zgodnie z tym co podałem w kolejności i jak to posortować ?

Może chodzi o to że przekazałeś argument jako hash, a elementy hash’a nie posiadają kolejności, tak jak tablice, w efekcie kolejność tych elementów jest losowa.

Do sortowania możesz użyć h.sort,

h = { "a" => 20, "b" => 30, "c" => 10 } h.sort #=> [["a", 20], ["b", 30], ["c", 10]]
Jak widać, zwróci tablice posortowana alfabetycznie według klucza.

<%= f.select :available, options_for_select({"-- brak danych --" => 0, "do uzgodnienia" => 1, "natychmiast" => 2, "data..." => 3}, 0) %>

zmień najlepiej na

<%= f.select :available, options_for_select([["-- brak danych --", 0], ["do uzgodnienia", 1], ["natychmiast", 2], ["data...", 3]], 0) %>

ha! masz racje :D:D:D

rozwiązaniem moim jest to:

  <%= f.select :available, options_for_select([["-- brak danych --", 0], ["do uzgodnienia", 1], ["natychmiast", 2], ["data...", 3]], 0) %>

dzięki pozdrawiam