Відповіді:
Є кілька відмінностей, але вони не великі:
.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як аргумент пропустить усі перевірки рейки