Рейки нові проти створення


195

Чому виникає потреба у визначенні нового методу в контролері RESTful, після чого слід за методом створення?

Пошук у Google не дав мені відповіді, яку я шукав. Я розумію різницю, але потрібно знати, чому вони використовуються такими, якими вони є.

Відповіді:


263

В рамках Rails впровадження REST new і create трактуються по-різному.

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

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


1
Я точно проскакував цю інформацію на сайті підручника з рейок. Це стало актуальним, поки я фактично не використовую його.
StorymasterQ

248

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

create (attributes = nil) {| об'єкт | ...}

Створює об’єкт (або кілька об'єктів) і зберігає його в базі даних, якщо перевірки проходять. Отриманий об'єкт повертається, вдало збережений об’єкт до бази даних чи ні.

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

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

Таким чином, createінстанціює новий об’єкт, перевіряє його, а потім зберігає його в базі даних. І newлише створює локальний об'єкт, але не намагається перевірити або зберегти його в БД.


6
Це питання стосується методів контролера, а не модельних методів.
sevenseacat

8
@Karpie - Дякую за голосування. Ви добре зазначаєте, але вважаєте, що багато людей вважають цю відповідь корисною, тим більше, що ні заголовок, ні теги не називають це питанням лише для контролера. Тому я думаю, що ця відповідь надає цінність точно так само.
Джастін Етьє

17

Новий екземпляр нового екземпляра Model, але він не зберігається, поки не буде викликаний метод збереження.

Create робить те саме, що і нове, але також зберігає його в базі даних.

Іноді ви хочете робити речі, перш ніж щось зберегти в базі даних, іноді просто хочеться створити і зберегти це відразу.


1
Це питання стосується методів контролера, а не модельних методів.
sevenseacat

11

RESTful частини Rails зроблені дуже близькими до того, як працює протокол HTTP. У протоколі HTTP запит GET не повинен змінювати жодні дані. Логічно, якщо ви подивитесь на те, як працюють усі RESTful дії в Rails, вони будуть відповідати дій HTTP. POST призначений для генерування нових даних, тому він логічно створюється. Ви використовуєте GET, щоб подавати нову дію у формі версії тієї чи іншої мови. Покажчик і шоу також GET, оновлення - PUT (або PATCH в Rails 4+), а знищення - DELETE в HTTP.

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


"You use a GET to serve the form version of that or in other words, the new action"дякую за відповідь, але особисто я вважаю, що ця конвенція про іменування дуже заплутана
Даніель Лізик
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.