REST - zasób z kilkoma stanami

Mam proste zarządzanie zadaniami (coś jak np. assembla), w którym zadanie jest wykonywane przez ucznia, a następnie sprawdzane przez nauczyciela, a całe zadanie reaguje jak maszyna stanów.

Stany zadania:

  1. W trakcie realizacji (ongoing)
  2. Gotowe do oceny (ready)
  3. Rozwiązane (checked)

Uczeń może zmienić stan z 1 -> 2.
Nauczyciel może zmienić stan z 2 -> 3 (jeśli nie ma błędów), lub z 2 -> 1 (jeśli są błędy i zadanie należy poprawić).
W przyszłości stanów może być więcej.

Pytanie1: Jak powinny się zgodnie z RESTem nazywać kontrolery i akcje?

Myślałem nad trzema rozwiązaniami:

  1. Najprostsze rozwiązanie to jeden wielki task controller z akcjami w stylu: teacher_edit, student_edit, teacher_show. itp… ale to nie jest zgodne z duchem RESTu.
  2. Jeden task controler, ze standardowymi akcjami: show, edit, update, w parametrach przekazuję, czy jest to akcja ucznia lub nauczyciela, ewentualnie sprawdzam, jaki użytkownik się do akcji dobiera. Minusem jest to, że akcje i widoki byłyby skomplikowane (zwłaszcza jak dojdą kolejne stany).
  3. Każdy stan ma osobny kontroller, np: ready_task, ongoing_task i w środku prosty CRUD. Wydaje mi się, że właśnie na tym polega REST, jeden stan, to jeden zasób. Tylko wtedy rozumiem, że zmiana stanu z 1->2, to powinna być akcja update w ongoing_task, a nie create w ready_task?

Dobrze kominuję?

IMHO rozwiązanie 2 + uproszczenie sobie pracy ze stanami za pomocą http://www.pluginaweek.org/2009/04/05/state_machine-07-better-integrations-more-access/

Najprostsze rozwiązanie to 1 kontroler i akcje edit/update… nie wiem czy to pasuje do architektury systemu, ale tak na oko się wydaje.

Jeśli jesteś zalogowany jako uczeń to akcja /tasks/1/edit wygeneruje formularz umożliwiający zmianę stanu tylko z 1 na 2, a akcja update dodatkowo sprawdzi czy aktualny user to uczeń a jeśli tak to tylko na taką zmianę pozwoli.

jeśli jesteś nauczycielem - możesz sobie zmieniać stany jak chcesz…

Zadziała?

Problem jest tak naprawdę religijny :wink:

Na pewno wyrzuć do kosza rozwiązanie 1), bo natworzysz sobie wuchtę słabo czytelnego kodu (zwłaszcza routes.rb – zapaskudzenie tego pliku to przepis na katastrofę).
2) i 3) to właśnie kwestia religijna, bo oba rozwiązania są równie poprawne z technicznego i praktycznego punktu widzenia. Przy czym mniej kodu (plików, ścieżek) do utrzymania wydaje się dawać rozwiązanie 2., przynajmniej na obecnym etapie (ale 3. pewnie będzie łatwiejsze w rozwijaniu).

A może po prostu dla tego jednego kontrolera zrezygnować z REST i nie robić go zasobem, dobierając się doń oldskulowo, czyli :controller, :action?

Czekałem na więcej niż jedną opinię i potwierdziliście to o czym myślałem. Nie jest jakimś szczególnym problemem zrobić to w REST i ponieważ widzę, że na razie nie zanosi się, by liczba stanów się rozrosła powyżej czterech, to jeden kontroler i standardowe akcje dadzą radę. Dzięki.