Szyny nowe vs tworzenie

195

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

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

sent-hil
źródło

Odpowiedzi:

263

W ramach implementacji REST w Rails nowe i tworzenie są traktowane inaczej.

HTTP GET /resources/newto ma na celu renderowanie formularza odpowiedniego do utworzenia nowego zasobu, co robi przez wywołanie nowej akcji w kontrolerze, który tworzy nowy niezapisany rekord i renderuje formularz.

HTTP POST /resourcespobiera rekord utworzony jako część nowej akcji i przekazuje go do akcji tworzenia w kontrolerze, która następnie próbuje zapisać go w bazie danych.

Steve Weet
źródło
1
Dokładnie przejrzałem te informacje na stronie z samouczkami na temat szyn. Dopiero kiedy faktycznie go użyłem, stało się to istotne.
StorymasterQ
248

Z dokumentacji ActiveRecord :: Base :

create (atrybuty = zero) {| obiekt | ...}

Tworzy obiekt (lub wiele obiektów) i zapisuje go w bazie danych, jeśli sprawdzanie poprawności przebiegnie pomyślnie. Wynikowy obiekt jest zwracany niezależnie od tego, czy obiekt został pomyślnie zapisany w bazie danych, czy nie.

new (atrybuty = zero) {| self jeśli block_given? | ...}

Nowe obiekty mogą być tworzone jako puste (nie przekazuj parametru konstrukcji) lub wstępnie ustawione z atrybutami, ale jeszcze nie zapisane (przekaż skrót z nazwami kluczy pasującymi do nazw kolumn w 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.

Tak createtworzy instancję nowego obiektu, sprawdza go, a następnie zapisuje w bazie danych. I newtylko tworzy obiekt lokalny, ale nie próbuje sprawdzać poprawności ani zapisywać go w bazie danych.

Justin Ethier
źródło
5
To pytanie dotyczy metod kontrolera, a nie metod modelu.
sevenseacat
8
@Karpie - Dziękuję za opinię. Masz rację, ale uważaj, że wiele osób uznało tę odpowiedź za przydatną, zwłaszcza, że ​​ani tytuł, ani tagi nie wywołują jej jako pytania wyłącznie do kontrolera. Myślę więc, że ta odpowiedź ma taką samą wartość.
Justin Ethier,
16

Nowy tworzy nową instancję modelu, ale nie jest ona zapisywana, dopóki nie zostanie wywołana metoda save.

Utwórz robi to samo co nowy, ale także zapisuje go w bazie danych.

Czasami chcesz coś zrobić przed zapisaniem czegoś w bazie danych, a czasem po prostu chcesz to utworzyć i zapisać od razu.

ghoppe
źródło
1
To pytanie dotyczy metod kontrolera, a nie metod modelu.
sevenseacat
11

Części RESTful Railsów są 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 Railsach, będą one pasować do akcji HTTP. POST służy do generowania nowych danych, więc jest logicznie tworzony. Używasz GET, aby podać wersję formularza tego lub innymi słowy, nową akcję. Indeks i pokaż są również GET, aktualizacja to PUT (lub PATCH w Railsach 4+), a zniszczenie to DELETE w HTTP.

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

Jared
źródło
"You use a GET to serve the form version of that or in other words, the new action"dzięki za odpowiedź, ale osobiście uważam, że ta konwencja nazewnictwa jest bardzo myląca
Daniel Lizik