Чтобы мыслить RESTful, вам, вероятно, следует перестать думать о них как о «контроллерах с действиями» и начать думать о них как о «объектах, которые можно создавать / обновлять и т. Д.» - контроллеры являются просто прокси для представлений, которые показывают результаты создания / обновление объекта.
В большинстве случаев я обнаружил, что дополнительное действие на самом деле является всего лишь разновидностью «обновления» - только с его собственными особыми требованиями (например, только определенные люди могут обновить его или что-то еще). Такая логика часто может быть внутри самой модели (например, «MyModel # can_be_edited_by? (Some_user)»).
Иногда вы обнаруживаете, что на самом деле у вас есть дополнительная «скрытая» модель, которой нужен собственный интерфейс RESTful.
Например, с вашим "принять" опрос - я предполагаю, что у вас есть что-то вроде "SurveyResult", и человек может "создать" опрос ", но когда он" принимает "опрос, он фактически создает «SurveyResult» (другой комментатор назвал это «SurveyParticipation» - но это то же самое).
Дело в том, что у вас, вероятно, будет несколько SurveyResults, каждый из которых own_to: survey и assign_to: some_user_model.
Тогда вы можете настроить хорошие маршруты отдыха, такие как:
/ обзоры / 123-my_favourite_colour / Результаты
, который вернет набор всех результатов для одного опроса
Это на самом деле RESTful способ просмотреть эту часть вашего объектного пространства.
Что касается обмена опросом - это более интересный вопрос. Это зависит от того, как у вас есть настройки авторизации для «обмена». Это также зависит от того, что вы подразумеваете под «поделиться».
Разделяете ли вы результаты опроса или сами опрашиваете объект опроса (чтобы другой пользователь мог редактировать вопросы) или вы (как человек, который только что принял участие в опросе) делитесь ссылкой на опрос, чтобы ваш друзья тоже могут пройти опрос?
Для первых двух выше - я бы рассмотрел класс "SurveyPermission", который принадлежит_для: опросом и принадлежат_для: some_user_model.
Вы можете создать SurveyPermission для другого пользователя - и опросы могут быть отредактированы создателем или кем-либо, у кого есть разрешение на его редактирование.
Таким образом, действие общего доступа заключается в создании SurveyPermission.
Хотя, честно говоря, ваш SurveyPermission, скорее всего, будет использоваться только для создания и удаления, поэтому может быть проще вставить эти два действия в контроллер Survey.
Для последнего - ну, это просто отправка кому-нибудь ссылки "create_survey_result (@survey)" ...
Обновление:
Обычно я не беспокоюсь о пространствах имен, если нет двух ресурсов, названных одним и тем же (но в разных контекстах). Вам нужны только пространства имен для разрешения разногласий между ними, а здесь это не так.
В этом случае - единственное возникающее пространство имен находится в маршрутизации:
map.resources :surveys do |s|
s.resources :results
s.resources :shares # ???
end
дает такие маршруты как:
new_survey_path
surveys_path
new_survey_result_path(@survey)
survey_results_path(@survey)