Rails new vs create

Почему существует необходимость в определении нового метода в контроллере RESTful, выполните его с помощью метода create?

Поиск Google не предоставил мне ответ, который я искал. Я понимаю разницу, но вам нужно знать, почему они используются так, как они есть.

Ответ 1

В Rails-реализации REST new и create обрабатываются по-разному.

HTTP GET to /resources/new предназначен для рендеринга формы, подходящей для создания нового ресурса, который он делает, вызывая новое действие в контроллере, которое создает новую несохраненную запись и отображает форму.

HTTP POST to /resources берет запись, созданную как часть нового действия, и передает ее в действие create внутри контроллера, которое затем пытается сохранить его в базе данных.

Ответ 2

В документации ActiveRecord:: Base:

create (attributes = nil) {| object |...}

Создает объект (или несколько объектов) и сохраняет его в базе данных, если проходят проверки. Получаемый объект возвращается, был ли объект успешно сохранен в базе данных или нет.

new (attributes = nil) {| self if block_given? |...}

Новые объекты могут быть созданы как пустые (не передают конструктивный параметр) или предварительно заданы с атрибутами, но еще не сохранены (передайте хэш с именами ключей, соответствующими именам столбцов соответствующих таблиц). В обоих случаях действительные ключи атрибутов определяются именами столбцов связанной таблицы, поэтому вы не можете иметь атрибуты, которые не являются частью столбцов таблицы.

Итак create создает экземпляр нового объекта, проверяет его и затем сохраняет в базе данных. И new создает только локальный объект, но не пытается проверить или сохранить его в БД.

Ответ 3

Новый экземпляр экземпляра новой модели, но он не сохраняется до тех пор, пока не будет вызван метод сохранения.

Создать делает то же, что и новый, но также сохраняет его в базе данных.

Иногда вы хотите делать что-то, прежде чем сохранять что-то в базе данных, иногда просто хотите создать и сохранить его сразу.

Ответ 4

RESTful части Rails сделаны очень близко к тому, как работает протокол HTTP. В HTTP-протоколе запрос GET не должен изменять какие-либо данные. Логически, если вы посмотрите, как работают все действия RESTful в Rails, они будут соответствовать действиям HTTP. POST предназначен для создания новых данных, поэтому он логически создается. Вы используете GET, чтобы обслуживать версию формы этого или, другими словами, новое действие. Индекс и показ также являются GET, обновление представляет собой PUT (или PATCH в Rails 4+), а destroy - это DELETE в HTTP.

Кроме того, он прекрасно разделяет логику в контроллере и дает вам гладкий способ справиться с ошибками (путем повторного рендеринга нового действия с сообщениями об ошибках).