Rails - Redundant RESTFUL Действия для map.resources? (новый, создать)

StackOverflow https://stackoverflow.com/questions/1417463

Вопрос

Мне было интересно, почему, когда вы создаете спокойные маршруты в рельсах с 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 " и " создать " выполняют принципиально разные задачи, что, как мы надеемся, будет ясно из предыдущих параграфов. Один из них отображает форму, а другой создает новый ресурс. Вы могли бы перегрузить один и тот же метод, чтобы сделать это, конечно, но без веской причины для этого создание двух небольших независимых методов для обработки двух небольших независимых задач, вероятно, является более естественным подходом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top