Rails - Redundant RESTFUL Действия для map.resources? (новый, создать) - PullRequest
2 голосов
/ 13 сентября 2009

Мне было интересно, почему, когда вы создаете спокойные маршруты в рельсах с 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 основан на глаголах, разве это не лучший подход для использования?

Спасибо за внимание

1 Ответ

4 голосов
/ 13 сентября 2009

Я думаю, что здесь есть две связанные, но отличные проблемы: открытые 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 будет примерно переводиться как «создать нового пользователя / создать». ", что не совсем имеет смысла.

Что касается методов контроллера, то "new" и "create" выполняют принципиально разные задачи, как мы надеемся, понятно из предыдущих параграфов. Один из них отображает форму, а другой создает новый ресурс. Вы, конечно, можете перегружать один и тот же метод, чтобы сделать это, но без веской причины для этого создание двух небольших независимых методов для обработки двух небольших независимых задач, вероятно, является более естественным подходом.

...