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 одинаково, и, по-видимому, оба они ошибаются. Поэтому я рекомендую:

  • POST для создания
  • PATCH при обновлении
  • GET на индекс, новый, показать
  • вообще не использовать PUT
  • если вы обнаружите, что ваш контроллер делает какое-то странное действие, попробуйте перестроить ваши контроллеры (введите новый контроллер, возможно, http://jeromedalbert.com/how-dhh-organizes-his-rails-controllers/)

Но если весь ваш проект использует 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