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:
W trakcie realizacji (ongoing)
Gotowe do oceny (ready)
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:
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.
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).
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?
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…
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.