Widziałem więc ludzi używających .build, .create i .create! w swoich kontrolerach ostatnio coraz częściej. Jaka jest różnica między zwykłym użyciem .new i przekazaniem obiektu param'd, a następnie .save? Czy są wady i zalety? Czy stosowanie innych metod przynosi korzyści?
ruby-on-rails
Tim Knight
źródło
źródło
Chociaż prawdą jest, że
create
wywołuje,new
a następniesave
istnieje duża różnica między dwiema alternatywami w ich wartościach zwracanych.Save
powraca znakamitrue
lubfalse
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żywasznew
+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órychrespond_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 statusieunprocessable_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.źródło
#create to krótsza wersja nowego i zapisz. #Stwórz! zgłasza wyjątek, jeśli walidacja nie była pozytywna.
źródło
Poparłbym powyższe odpowiedzi. Poza
create
tym nie możnafalse
podać argumentu, z którym można się posłużyćsave
. Podaniefalse
jako argument spowoduje pominięcie wszystkich walidacji szynźródło