Chociaż prawdą jest, że create
wywołuje, new
a następnie save
istnieje duża różnica między dwiema alternatywami w ich wartościach zwracanych.
Save
powraca znakami true
lub false
w zależności od tego, czy obiekt został pomyślnie zapisany w bazie danych, czy nie. Można to następnie wykorzystać do sterowania przepływem, jak w pierwszym przykładzie w powyższym pytaniu.
Create
zwróci model niezależnie od tego, czy obiekt został zapisany, czy nie. Ma to konsekwencje dla powyższego kodu, ponieważ górna gałąź if
instrukcji będzie zawsze wykonywana, nawet jeśli obiekt nie przejdzie walidacji i nie zostanie zapisany.
Jeśli używasz create
z logiką rozgałęzień, jesteś narażony na ciche awarie, co nie ma miejsca, jeśli używasz new
+ save
.
create!
nie cierpi z powodu tego samego problemu, który powoduje, i wyjątku, jeśli rekord jest nieprawidłowy.
create
Alternatywą może być użyteczne w regulatory, których respond_with
używa się do API (JSON / XML) odpowiedzi. W takim przypadku istnienie błędów w obiekcie spowoduje zwrócenie błędów w odpowiedzi o statusie unprocessable_entity
, czyli dokładnie takim, jakiego oczekujesz od API.
Zawsze używałbym opcji new
+ save
dla html, zwłaszcza jeśli polegasz na wartości zwracanej do kontroli przepływu.