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.