Rails новые против создания - PullRequest
188 голосов
/ 18 марта 2010

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

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

Ответы [ 4 ]

251 голосов
/ 18 марта 2010

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

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

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

241 голосов
/ 18 марта 2010

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

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

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

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

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

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

15 голосов
/ 18 марта 2010

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

Create делает то же самое, что и new, но также сохраняет его в базе данных.

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

9 голосов
/ 19 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...