Witam,
dalej walczę ze swoim prostym systemem wprowadzania danych. Jak zwykle powiem najpierw jaki efekt chcę osiagnąć - przy okazji sądzę, że z tym drobnym problemem spotykacie się wiele razy, ale jakoś nie mogę go przeskoczyć od wczoraj, mimo że posiłkuję sie wieloma tutorialami i przykładami.
Otóż: moja baza danych ma zawierać najróżniejsze pojazdy. Każdy pojazd ma główny typ (pojazd drogowy, pociag, samolot, statek), a każdy typ powinien mieć odpowiadające mu kategorie (pojazdy drogowe to np. samochody osobowe, cieżarówki, czołgi, a wśród statków mogą być promy i łodzie podwodne). Więc jeżeli wprowadzamy do bazy danych nowy pojazd (klasa vehicle) musimy zdefiniować jego typ (klasa vtype) i jego kategorię (vclass).
W widoku vehicles/new utworzonym automatycznie ze scaffoldu zamieniłem text_field na collections_select, żeby dodawany obiekt miał parametry wybierane z innych tabel, a nie wklepywane z palca (to był poprzedni problem, który tu zgłaszałem i rozwiązałem). Teraz oczywiście chciałbym, żeby zawartość drugiego selectboxa (tego z kategoriami) byłą wypełniana (czy jak to się mówi - populowana) opcjami zgodnymi tylko i wyłącznie z głównym typem, tak, aby nie tworzyć pojazdów drogowych, które są łodziami podwodnymi
Poczytałem trochę i zauważyłem, że najlepszym rozwiazaniem (o ile nie jedynym) jest budowanie drugiego selectboxa za pomocą partiala - i tu jest pies pogrzebany.
Pliki biorące udział w tej operacji:
vehicles/new.html.erb
[code=ruby]
New vehicle
<% form_for(@vehicle) do |f| %>
<%= f.error_messages %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :designation %>
<%= f.text_field :designation %>
<%= f.label :vtype_id %>
<%= f.collection_select :vtype_id, Vtype.find(:all), :id, :name,
{:prompt => '-pick one-'},
{:id => 'select_vtype'} %>
<%= observe_field 'select_vtype',
:update => 'vclassdiv',
:url => {:remote_action => :update_vclasses},
:with => 'select_vtype' %>
<%= f.label :vclass_id %>
<%= f.label :description %>
<%= f.text_area :description %>
<%= f.submit 'Create' %>
<% end %><%= link_to ‘Back’, vehicles_path %>[/code]
vehicle_controller
code=ruby
def update_vclasses
@vclasses = Vclass.all.select {|x| x.vtype_id == params[:select_vtype]}
render :update do |page|
page.replace_html 'vclass', :partial => 'vclasspart', :object => @vclasses
end
end
(…)
def new
@vehicle = Vehicle.new
@vtypes = Vtype.find_all_for_select
@vclasses = Vclass.find_all_for_select
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @vehicle }
end
end[/code]
Na końcu partial views/_vclasspart.html.erb
<%= select (:vehicle, :vclass_id, @vclasses) %>
Po uporaniu sie z wieloma błędami wcześniej zostaję z takim problemem, że wybranie czegokolwiek z pierwszego selecta skutkuje nie wyświetleniem partiala, ale wyświetleniem kopii całego widoku vehicles/new.html.erb , zagnieżdżonej w DIV’ie o nazwie vclassdiv.
Potrzebuję pomocy