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ą.

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.


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.


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.


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).


"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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.