Rails new vs create

Dlaczego istnieje potrzeba zdefiniowania nowej metody w kontrolerze RESTful, a następnie za pomocą metody create?

Wyszukiwarka Google nie dostarczyła mi odpowiedzi, której szukałem. Rozumiem różnicę, ale muszę wiedzieć, dlaczego są używane w taki sposób, w jaki są.

Author: sent-hil, 2010-03-18

4 answers

W implementacji REST newi create są traktowane inaczej.

HTTP GET to /resources/new jest przeznaczone do renderowania formularza odpowiedniego do utworzenia nowego zasobu, co robi poprzez wywołanie akcji new wewnątrz kontrolera, która tworzy nowy niezapisany rekord i renderuje formularz.

Post HTTP do /resources pobiera rekord utworzony jako część akcji new i przekazuje go do akcji create wewnątrz kontrolera, który następnie próbuje zapisać go do bazy danych.

 269
Author: Steve Weet,
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
2012-08-11 15:38:09

From the ActiveRecord:: Base documentation:

create (attributes = nil) {|object| ...}

Tworzy obiekt (lub wiele obiektów)i zapisuje go do bazy danych, jeśli walidacje przebiegną. Wynikowy obiekt jest zwracany niezależnie od tego, czy obiekt został pomyślnie zapisany w bazie danych, czy nie.

new (attributes = nil) {/self if block_given?| ...}

Nowe obiekty mogą być tworzone jako puste (pass no parametr budowy) lub wstępnie ustawiony z atrybutami, ale jeszcze nie zapisany(przekaż hash z nazwami kluczy pasującymi do powiązanych nazw kolumn tabeli). W obu przypadkach prawidłowe klucze atrybutów są określane przez nazwy kolumn powiązanej tabeli - dlatego nie można mieć atrybutów, które nie są częścią kolumn tabeli.

Więc create tworzy instancje nowego obiektu, sprawdza go, a następnie zapisuje do bazy danych. I new tworzy tylko obiekt lokalny, ale nie próbuje walidować lub zachowaj to dla DB.

 253
Author: Justin Ethier,
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
2010-03-18 18:33:49

New tworzy instancje nowej instancji modelu, ale nie jest ona zapisywana, dopóki nie zostanie wywołana metoda save.

Create robi to samo co new, ale również zapisuje go do bazy danych.

Czasami chcesz coś zrobić przed zapisaniem czegoś do bazy danych, czasami po prostu chcesz utworzyć i zapisać to od razu.

 17
Author: ghoppe,
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
2010-03-18 18:31:27

Pozostałe części Rails są wykonane tak, aby były bardzo zbliżone do działania protokołu HTTP. W protokole HTTP żądanie GET nie powinno modyfikować żadnych danych. Logicznie, jeśli spojrzysz na sposób, w jaki działają wszystkie akcje RESTful w Rails, będą one pasowały do akcji HTTP. POST służy do generowania nowych danych, więc jest logicznie tworzony. Używasz GET do serwowania wersji formularza tego lub innymi słowy, nowej akcji. Index I show to także GETs, update to PUT (lub PATCH w Rails 4+), A destroy to usuwanie w HTTP.

Ponadto, ładnie oddziela logikę w kontrolerze i daje płynny sposób radzenia sobie z błędami (poprzez ponowne renderowanie nowej akcji z komunikatami o błędach).

 11
Author: Jared,
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
2014-08-12 19:54:28