Różnice między.build,.tworzenie, oraz.twórz! a kiedy należy je stosować?
Więc widuję ludzi używających .build, .tworzenie, oraz .twórz! w ich kontrolerach coraz częściej. Jaka jest różnica od samego użycia .nowy i pasywny obiekt param ' d, a następnie .uratować? Czy są plusy i minusy? Czy korzystanie z tych innych metod daje korzyści?
4 answers
Jest kilka różnic, ale nie są duże:
-
.create
jest równoważne.new
, po którym następuje.save
. To bardziej zwięzłe. -
{[3] } jest równoważne
.new
, a następnie.save!
(wyrzuca błąd, jeśli zapisanie nie powiedzie się). Jest również trochę krótszy - myślę, że
.build
jest głównie aliasem dla.new
. To działa w jedną stronę w Rails 3 i w drugą w Rails
Najważniejszą częścią jest jednak to, że te metody może być wywołany przez asocjację (has_many
, itd.), aby automatycznie połączyć oba modele.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:16
Chociaż prawdą jest, że create
wywołuje new
, a następnie save
Istnieje duża różnica między obiema alternatywami w ich wartościach zwrotnych.
Save
zwraca 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 na pierwszym przykładzie w powyższym pytaniu.
Create
zwróci model niezależnie od tego, czy obiekt został zapisany, czy nie. Ma to wpływ na powyższy kod w że górna gałąź instrukcji if
będzie zawsze wykonywana, nawet jeśli obiekt nie dokona walidacji i nie zostanie zapisany.
Jeśli używasz create
z logiką rozgałęziającą 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 podnosi i wyjątku, jeśli rekord jest nieprawidłowy.
Alternatywa create
może być przydatna w kontrolerach, gdzie respond_with
jest używana do odpowiedzi API (JSON/XML). W tym przypadku istnienie błędów na obiekcie spowoduje, że błędy zostaną zwrócone w odpowiedzi o statusie unprocessable_entity
, co jest dokładnie tym, czego oczekujesz od API.
Zawsze używałbym new
+ save
opcja dla html, zwłaszcza jeśli polegasz na zwracanej wartości dla kontroli przepływu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-08 08:53:14
#create jest krótszą wersją new i save. / align = "left" / wyrzuca wyjątek, jeśli Walidacja nie była pozytywna.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-31 18:25:09
Popieram powyższe odpowiedzi. Plus dla create
, nie można przekazać false
jako argumentu, który można zrobić za pomocą save
. Podanie false
jako argumentu pominie wszystkie walidacje rails
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-05 05:19:37