Rails Put vs Post
Я читал разницу между сообщениями put и post, и у меня есть некоторые связанные вопросы, поскольку это относится к рельсам: я хотел бы изменить одно конкретное поле в уже созданной строке... я должен использовать put или почтовый запрос? Например, следующие разные?
#Assume this is a put request
def update
@model=Model.find(x)
@model.field="new_field"
@model.save
end
#Assume this is a post request
def update
@model=Model.find(x)
@model.field="new_field"
@model.save
end
#What if I use the rails update method?
def update
@model=Model.find(x)
@model.update(model_params)
@model.save
end
Спасибо заранее.
Ответы
Ответ 1
В соответствии с соглашением rails
PUT используется для обновления существующего ресурса
POST используется для создания нового ресурса
В рельсах 4 PUT был изменен на PATCH, чтобы избежать путаницы.
Сгенерированные Rails маршруты будут выглядеть по умолчанию ниже
posts GET /posts(.:format) {:action=>"index", :controller=>"posts"}
POST /posts(.:format) {:action=>"create", :controller=>"posts"}
new_post GET /posts/new(.:format) {:action=>"new", :controller=>"posts"}
edit_post GET /posts/:id/edit(.:format) {:action=>"edit", :controller=>"posts"}
post GET /posts/:id(.:format) {:action=>"show", :controller=>"posts"}
PUT /posts/:id(.:format) {:action=>"update", :controller=>"posts"}
DELETE /posts/:id(.:format) {:action=>"destroy", :controller=>"posts"}
Обратите внимание на действие для PUT и POST
Ответ 2
Rails по умолчанию стремится использовать HTTP-глаголы способом, изложенным в спецификации REST, вас не должно беспокоить, почему методы могут позволить вам выполнить одно и то же действие. Вместо этого вы должны подумать о предоставлении API, который является RESTful и который пользователи поймут. Это поведение по умолчанию может быть переопределено.
REST означает, что:
Запрос, использующий метод POST, должен воздействовать на коллекцию ресурсов; добавление нового ресурса в коллекцию Пример URL: http://example.com/resources
Запрос, использующий HTTP-глагол PUT, должен воздействовать на один ресурс в коллекции; полная замена ресурса на сервере Пример URL: http://example.com/resource/1
Запрос, использующий глагол PATCH HTTP, должен действовать на один ресурс в коллекции; обновление определенных атрибутов на ресурсе, где он находится Пример URL: http://example.com/resource/1
Rails 4 теперь использует глагол PATCH над глаголом PUT для обновления ресурса.
Ответ 3
- Я думаю, мы должны использовать PATCH при обновлении некоторых атрибутов записи
- PUT действительно означает что-то в контексте "замены" ресурса или всех его атрибутов, но может также означать создание ресурса (я основываю это на том, что я помню, прочитав эту книгу: REST API Design Rulebook). Например, когда вы перемещаете (копируете) ресурс AWS S3, вы запускаете PUT not POST. Так что PUT запутывает.
- POST следует использовать при отправке нового ресурса
В PATCH также много путаницы, я лично соглашаюсь с тем, как предлагает стандарт API JSON http://jsonapi.org/format/#crud-updating:
PATCH /articles/1 HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"data": {
"type": "articles",
"id": "1",
"attributes": {
"title": "To TDD or Not"
}
}
}
Мне нравится Rails I, но, правда, это не полностью соответствует некоторым основным веб-соглашениям. Rails пытается быть продуктивным, а слишком строгие соглашения снижают производительность. Поэтому не идите за борт, когда ищете ответ для этого. Правда в том, что Rails обрабатывает PUT и PATCH одинаково, и, по-видимому, оба они ошибаются. Поэтому я рекомендую:
Но если весь ваш проект использует PUT всюду, вам не нужно проходить и изменять все. Просто придерживайтесь одного или другого (PUT или PATCH).
ОБНОВЛЕНИЕ
Я написал 2 статьи по этой теме, где я углубляюсь в эту тему.
Ответ 4
PUT и POST - это HTTP-методы.
В route.rb вам нужно отобразить метод и действие # контроллера. В вашем классе вы определяете 3 раза тот же метод. Поэтому, если вы хотите сопоставить эти действия с методом HTTP, вы не можете.
Вы собираетесь изменить имя каждого метода и изменить реализацию на класс модели.
Ответ 5
Запрос PUT используется для обновления содержимого, а запрос POST - для создания или публикации нового содержимого.
Итак, вы хотите изменить одно конкретное поле в уже созданной строке, а затем использовать приведенный ниже код
приложение/контроллеры/model_controller.rb
def update @model = Model.find(params [: id]) @model.update(model_params) end