Multi steps

Witam serdecznie,

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):

[code] def create
session[:advert_params].deep_merge!(params[:advert]) if params[:advert]
@advert = current_user.adverts.new(session[:advert_params])
@advert.current_step = session[:advert_step]

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 ?

No to dodaj do obiektów “step” pole logiczne “visited”, które będzie trzymało informację o tym, czy krok był już odwiedzony.

heh no wlasnie nie do konca wiem jak to zrealizować :smiley:
próbowałem coś na wzór tego: @advert.visited_step = 1;

ale to wywala błędy :smiley:

attr_accessor :visited

może to w klasie definiującej step
trochę strzelam, nie oglądałem tego railscasta

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”.

A nie lepiej w sesji trzymać jaki krok był odwiedzany?

na sesji wyszło naj rozsądniej. Dzięki za odpowiedzi.

Pamiętaj o resetowaniu tej informacji przy rozpoczynaniu pracy z kreatorem! :wink: