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?

Author: Tim Knight, 2008-12-31

4 answers

Jest kilka różnic, ale nie są duże:

  1. .create jest równoważne .new, po którym następuje .save. To bardziej zwięzłe.
  2. {[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
  3. 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.

 221
Author: zenazn,
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.

 32
Author: nmott,
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.

 6
Author: rkj,
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

 5
Author: Vineeth,
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