robie w swojej aplikacji multi steps wzorując się na tym: http://railscasts.com/episodes/217-multistep-forms
i wszystko idzie bezproblemowo. Mój problem polega na dodaniu dodatkowej funkcjonalności mianowicie sprawdzania czy user byl juz na danym kroku.
Chodzi przede wszystkim o to by wykorzystac linkowanie do kroków które user już przeszedl. Obecnie w widoku mam tak:
[code]
<% @advert.steps.each do |step| %>
<% if @advert.current_step == step %>
<%= step %>
<% else %>
<%= step %>
<% end %>
<% end %>
[/code]
chciałbym dodać jeszcze jeden warunek coś ala:
[code]<% if @advert.krok_na_ktorym_juz_bylem == step %>
<%= step %>
<% end %>[/code]
macie pomysły jak to wykonać?
Zastanów się dobrze, czy ma sens dodawanie linków do kroków o więcej niż jeden wstecz. Skoro to multi-step form, to często jest tak, że część danych w następnym korku jest wykorzystywanych na bazie kroku poprzedniego.
Jeśli jednak nie stanowi to dla Ciebie problemu, to chyba najprościej jest ponumerować kroki i zrobić “each_with_index”, dodając linki w wszystkich krokach, których indeks jest mniejszy niż indeks aktualnego kroku.
Sens jest z tego względu iż np. mam 6 kroków user przeszedł 5 i w trakcie przypomniał sobie że np. w kroku 2 złe dane dodał to uciążliwe będzie dla niego cofanie się o krok przyciskiem “back” do odpowiedniego kroku a nastepnie “continue” kilka razy by dojść do tego co był.
Mój multistep ma działać na zasadzie rozgraniczenia pewnych typów danych by nie było jednego wielkiego formularza tylko kilka małych ktore można uzupełnic lub nie - taka praktyka jest lepiej odbierana przez userów.
Obecnie moja metoda steps wygląda tak:
def steps
%w[step1 step2 step3 step4 step5 step6]
end
ładuje ona oczywiscie odpowiednie partiale.
to nie jest do konca sluczne rozwiazanie gdyz jesli cofne sie z kroku 6 do 2 poprawie krok drugi i będę chciał wrócic do 6 to nie mam możliwości tym rozwiązaniem. Ponadto obecnie wszystko jest ustawiane w metodzie create (przy wysłaniu posta):
if @advert.valid?
if params[:back_button]
@advert.previous_step
elsif @advert.last_step?
@advert.save if @advert.all_valid?
else
@advert.next_step
end
session[:advert_step] = @advert.current_step
end
if @advert.new_record?
render :action => 'new'
else
session[:advert_step] = session[:advert_params] = nil
flash[:notice] = "Successfully created advert!"
redirect_to @advert
end
end[/code]
dlatego też nie może być sterowania w GET’ie np. dodaj-ogloszenie,step2.html
Jakieś pomysły ?
Generalnie będzie trochę grzebania - może nie ma sensu tworzyć nowej klasy “step”, ale gdzieś w formularzu powinieneś przekazywać informację o tym, które kroki były odwiedzone. Z automatu zrobić się tego nie da, bo “step” to po prostu string, a nie obiekt klasy “Step”.