Rails новые против создания

195

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

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

Sent-Хил
источник

Ответы:

263

Реализация REST для новых и созданных в Rails трактуется по-разному.

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

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

Стив Уит
источник
1
Я просмотрел именно эту информацию на сайте обучения по рельсам. Только когда я фактически использую это, это становится уместным.
StorymasterQ
248

Из ActiveRecord :: Базовая документация:

создать (атрибуты = ноль) {| объект | ...}

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

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

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

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

Джастин этир
источник
5
Этот вопрос касается методов контроллера, а не методов модели.
Seseseacat
8
@Karpie - Спасибо за отзыв. Вы делаете хорошее замечание, но считаете, что многие нашли этот ответ полезным, тем более что ни заголовок, ни теги не вызывают его как вопрос только для контроллера. Поэтому я думаю, что этот ответ дает ценность точно так же.
Джастин Этье
16

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

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

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

ghoppe
источник
1
Этот вопрос касается методов контроллера, а не методов модели.
Seseseacat
11

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

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

Джаред
источник
"You use a GET to serve the form version of that or in other words, the new action"спасибо за ответ, но лично я нахожу это соглашение об именах действительно запутанным
Даниэль Лизик