Rails - Redundant RESTFUL Действия для map.resources? (новый, создать)
-
07-07-2019 - |
Вопрос
Мне было интересно, почему, когда вы создаете спокойные маршруты в рельсах с map.resources, он генерирует действия для new, create, edit, update ? Есть ли что-то неправильное в объявлении только одного действия для create и update и делать что-то подобное?
def create
unless post?
@user = User.new
else
redirect_to :action => 'index' if user.create(params[:user])
end
end
чтобы у нас было что-то вроде
:GET users/create # to show the form (same as action - new)
:POST users/create # to create a new user
, поскольку Restful основан на глаголах, разве это не лучший подход для использования?
Спасибо за внимание
Решение
Я думаю, что здесь есть две взаимосвязанные, но разные проблемы: открытые URL-адреса и методы контроллера, на которые они направляются. Поскольку любой из них может быть изменен независимо, я рассмотрю их отдельно. Кроме того, обратите внимание, что я буду говорить немного свободно и строго о REST, реализованном в контексте Rails.
Что касается внешних URL-адресов, я думаю, что это помогает различать URL-адреса, составляющие API системы (: GET users / 1
, : PUT users / 1
и т. д.) и URL-адреса, которые просто удобны для людей, использующих веб-браузер ( users / new
, users / 5 / edit
и т. д.). API - это получение ресурсов или взаимодействие с ними каким-либо образом - это URL-адреса, которые другой компьютер будет использовать при взаимодействии с вашей системой. Эти URL, как правило, являются просто адресом ресурса, с которым вы хотите взаимодействовать, и затем вы используете метод HTTP и параметры, чтобы указать, что именно вы хотите сделать (GET = показать мне этот ресурс, PUT = изменить этот ресурс и т. Д. ). Удобные URL-адреса предназначены для отображения формы, облегчающей человеку использование API. Вы можете отредактировать пользователя, используя curl, чтобы вручную ввести все параметры, которые вы хотите изменить, и сделать POST для users / 1, но для человека гораздо проще, если вы можете просто использовать форму . р>
Чтобы посмотреть приведенные выше примеры, может иметь смысл : GET users / create
(и очень похоже на : GET users / new
, который используется по умолчанию) , но : POST users / create
примерно переводится как " создать нового пользователя / create ", что не совсем имеет смысла.
Что касается методов контроллера, " new " и " создать " выполняют принципиально разные задачи, что, как мы надеемся, будет ясно из предыдущих параграфов. Один из них отображает форму, а другой создает новый ресурс. Вы могли бы перегрузить один и тот же метод, чтобы сделать это, конечно, но без веской причины для этого создание двух небольших независимых методов для обработки двух небольших независимых задач, вероятно, является более естественным подходом.