Aby myśleć RESTfully, powinieneś przestać myśleć o nich jako o "kontrolerach z akcjami" i zacząć myśleć o nich jako o "obiektach, które można tworzyć/aktualizować itp." - kontrolerzy są po prostu proxy dla widoków, które pokazują wyniki tworzenie/aktualizowanie obiektu.
Wiele razy odkryłem, że dodatkowa czynność jest tak naprawdę odmianą "aktualizacji" - tylko z własnymi specjalnymi wymaganiami (np. Tylko niektóre osoby mogą ją zaktualizować lub cokolwiek innego). Ten rodzaj logiki często może wejść do samego modelu (np. "MyModel # can_be_edited_by? (Some_user)").
Czasami okazuje się, że faktycznie masz dodatkowy "ukryty" model, który wymaga własnego interfejsu RESTful.
Np. Z twoją ankietą "bierz" - zgaduję, ale to, co masz, jest czymś w rodzaju "Ankiety", a osoba może "stworzyć" ankietę ", ale kiedy" wezmą "ankietę, faktycznie tworząc „SurveyResult” (drugi commentor nazwie to „SurveyParticipation” - ale to samo)
rzeczą jest, że prawdopodobnie będziesz mieć wiele SurveyResults że każdy belong_to. Badanie i belong_to: some_user_model
.
Następnie możesz skonfigurować ładne, spokojne trasy, takie jak: /surveyys/123-my_favourite_colour/results
, który zwróci zestaw wszystkich wyników dla pojedynczego badania
To jest rzeczywiście RESTful sposób, aby wyświetlić tę część swojej przestrzeni obiektowej.
Co do udostępnienia ankiety - to ciekawsze pytanie. To zależy od tego, jak masz ustawioną autoryzację do "udostępniania". Zależy to również od tego, co masz na myśli przez "udział". Czy udostępniasz wyniki ankiety lub udostępniasz sam obiekt ankiety (aby inny użytkownik mógł edytować pytania) lub jesteś (jako osoba, która właśnie wzięła udział w ankiecie) udostępniając link do ankiety, aby Twoi znajomi mogą również wziąć udział w ankiecie?
Dla pierwszych dwóch powyższych - rozważałbym klasę "SurveyPermission", która należy do: survey i belongs_to: some_user_model. Możesz utworzyć SurveyPermission dla innego użytkownika - ankiety mogą być edytowane przez twórcę lub każdego, kto ma uprawnienia do edycji. Tak więc akcja udostępniania polega na utworzeniu ankiety SurveyPermission. Jednak, szczerze mówiąc, twoja ankieta SurveyPermission będzie prawdopodobnie używana tylko do tworzenia i usuwania, więc łatwiej będzie trzymać te dwie akcje w kontrolerze Survey.
W tym ostatnim przypadku - dobrze, że po prostu wysyłając link do kogoś się „create_survey_result (@survey)” ...
Aktualizacja:
ja generalnie nie przeszkadza z przestrzeniami nazw, chyba że istnieją dwa zasoby o nazwie to samo (ale w różnych kontekstach). Potrzebne są tylko przestrzenie nazw, aby je rozróżnić, co nie ma miejsca w tym przypadku.
W tym przypadku - tylko Przestrzenie nazw, które występuje w routingu:
map.resources :surveys do |s|
s.resources :results
s.resources :shares # ???
end
daje takich trasach jak:
new_survey_path
surveys_path
new_survey_result_path(@survey)
survey_results_path(@survey)
Udział w rzeczywistości tworzy coś, co można jednocześnie opublikować na Facebooku, Linkedin i Twitterze. Więc wtedy kontroler SurveyShare ma sens. Ale czy stworzysz ankietę przestrzeni nazw? i czy SurveyController rzeczywiście w to wejdzie. survey_survey_path wydaje się dziwne. – hadees