Відповіді:
Є кілька відмінностей, але вони не великі:
.create
еквівалентний .new
наступному .save
. Це просто більш лаконічно..create!
еквівалентний .new
наступному .save!
(видає помилку, якщо збереження не вдається). Це також просто трохи коротше.build
це переважно псевдонім для .new
. Він працює в одну сторону в Rails 3 і інший в Rails <3.xНайважливіша частина, однак, полягає в тому, що ці методи можна викликати через асоціацію ( has_many
тощо), щоб автоматично зв’язати дві моделі.
Хоча правильно, що create
дзвінки new
і тоді save
велика різниця між двома альтернативами у їхніх повернених значеннях.
Save
повертає true
або false
залежно від того, вдало збережено об’єкт до бази даних чи ні. Потім це може бути використано для регулювання потоку, як показано в першому прикладі в питанні вище.
Create
поверне модель незалежно від того, збережений чи ні об'єкт. Це має значення для коду вище, оскільки верхня гілка if
оператора завжди буде виконуватися, навіть якщо об'єкт завершує перевірку і не зберігається.
Якщо ви використовуєте create
логіку розгалуження, ви загрожуєте мовчазними збоями, що не стосується new
+ save
.
create!
не страждає від тієї ж проблеми, що вона піднімається, та виняток, якщо запис недійсний.
create
Альтернатива може бути корисною в контролерах , де respond_with
використовуються API (JSON / XML) відповіді. У цьому випадку наявність помилок на об’єкті призведе до повернення помилок у відповіді зі статусом unprocessable_entity
, який саме ви хочете отримати від API.
Я завжди використовуватиму опцію new
+ save
для html, особливо якщо ви покладаєтесь на повернене значення для контролю потоку.
Я би другий відповіді вище. Плюс до цього create
, не можна передавати false
аргумент, який ви можете зробити save
. Передача false
як аргумент пропустить усі перевірки рейки