select_tag i ustawienie selected

Jak w poniższym kodzie zmusić select ustawiał sobie atrybut selected=“selected” dla wartości session[:filter_by_stars]? Nie mogę się niczego doszukać w dokumentacji.

[code]<% form_for :filter_by, :url => ‘’ do |f| %>

Filter by: star(s): 'submit();' %> <% end %>[/code]

<%= f.select :filter_by_stars @stars, {}, :onchange => ‘submit();’ %>

Nazwa select musi być taka sama jak nazwa zmiennej w sesji.

api: http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#M000399

Jakieś cuda się tu dzieją. Ktoś skasował mój post czy co?

Rozwiązanie jest prostsze, wystarczy zapisać tak:

  <%= f.select :stars, @stars, {:selected=>session[:filter_by_stars]}, :onchange => 'submit();' %>

W Agile2 proponują jakieś idiotyczne rozwiązanie. W ich ujęciu musiałbym wcześniej dodać:

<% @stars = "tu musi byc pusty string lub jakikolwiek inny, what a shit!" def @stars.id session[:filter_by_stars] end %>

Ten link do dokumentacji podesłany powyżej:

"Specify :selected => value to use a different selection or :selected => nil to leave all options unselected.

[quote]<% @stars = "tu musi byc pusty string lub jakikolwiek inny, what a shit!" def @stars.id session[:filter_by_stars] end %>
[/quote]
Yyyy a to niby co ma byc ?
ze niby nadpisujesz accessor dla id w String ? Nie rozumiem tej ideii :slight_smile:

Pozdrawiam
Pawel

[quote=ruthrsc][quote]<% @stars = "tu musi byc pusty string lub jakikolwiek inny, what a shit!" def @stars.id session[:filter_by_stars] end %>
[/quote]
Yyyy a to niby co ma byc ?
ze niby nadpisujesz accessor dla id w String ? Nie rozumiem tej ideii :)[/quote]
Taką “logikę” proponują autorzy Agile2…

Może sie zakręciłem, ale nie widze gdzie pada taka “propozycja”?

Według mnie ten kod pokazuje konstrukcje obiektu:

[code]<% @user = “cat”

def @user.id
4
end

def @user.name
“Dave”
end

def @user.country
“United States”
end

def @user.time_zone
res = TimeZone[-6].name
end

@order = “dog”
def @order.shipping_option
101
end

%>[/code]
A następnie kilka(naście) sposobów na generowanie formatek select. Wszystkie one są generowane dla obiektu @user, a więc domyślnie w selectach zostaną wybrane wartości nadane przy definiowaniu obiektu…

Wydaje mi się, że nie “poczułeś” jednego:

[code]<% form_for :user do |form| %>

<%=
@users = User.find(:all, :order => “name”).map {|u| [u.name, u.id] }
form.select(:name, @users)
%>[/code]
wygeneruje DLA obiektu :user (czyli dla obiektu przypisanego do zmiennej @user) selecta z wartościami z @users. Ale jeśli w wartościach tabeli wystąpi:

@users[id] = @user.id

wartość ta dostanie “tag” selected.

[quote=Marcin]Według mnie ten kod pokazuje konstrukcje obiektu:

<% @user = "cat"

[/quote]
… tia, kompletnie bezsensownego. Co robi ten tekst “cat”? Nic. Równie dobrze możesz tam wpisać “dupa”. Zadziała tak samo.

[quote=Marcin]Wydaje mi się, że nie “poczułeś” jednego:

[code]<% form_for :user do |form| %>

<%=
@users = User.find(:all, :order => “name”).map {|u| [u.name, u.id] }
form.select(:name, @users)
%>[/code]
wygeneruje DLA obiektu :user (czyli dla obiektu przypisanego do zmiennej @user) selecta z wartościami z @users[/quote]
Ja to wszystko rozumiem. Tylko co jeśli nie chcę przekazywać żadnego obiektu, a chcę używać składni forma z closures? Albo jak mój obiekt nie pochodzi z Active Record? Po prostu nawet nie wspomnieli o :selected. Ale dobrze że jest chociaż w API na stronie.

Ale to wszystko marność. :slight_smile: Właśnie ciesze się jak gwizdek, bo przed chwilą dosłali mi papierowe wydanie Agile2. :slight_smile:

No bo to jest przykład z d&#% :wink:

No właśnie tu jest problem bo w Ruby wszystko jest obiektem! Wiec trochę się nie da obiektu nie przekazać. @user = “cat” także nie pochodzi z ActiveRecord. A jednak da się to wyświetlić. Taka jest po prostu filozofia.
Albo używasz obiekt_1[metoda] i dla takowego generujesz pola formularza (wtedy wartości, jakie posiada obiekt zostaną użyte jako default/selected). Albo generujesz na sucho formatke o nazwach pól obiekt_2[metoda] z podanymi “z palca” wartościami domyślnymi. Po wysłaniu formularza do aplikacji i tak otrzymasz OBIEKT obiekt_2.

Różnica miedzy podejściami jest taka jak miedzy formularzem dodawania obiektu i edycji obiektu…