Scaffold, metoda new

Podczas generowania kodu rusztowania tworzona jest metoda new:

def new @entry = Entry.new end
Po co tworzony jest nowy obiekt, jesli pozniej przez widok new.rhtml przechodzimy do metody create, ktora tez tworzy nowy obiekt:

def create @entry = Entry.new(params[:entry]) ...

Ten obiekt jest używany do wyświetlenia formularza a konkretnie używany przez helpery typu:

text_field :entry, :title

(na przykład, także walidatory i mnóstwo innych rzeczy)

Ponieważ stan pomiędzy requestami nie jest nigdzie zapisywany w metodzie create nie masz już dostępu do obiektu z metody new więc metoda create tworzy nowy obiekt :slight_smile:

Dziekuje :slight_smile: Ok, juz wszystko jasne. Troche zmylilo mnie to, ze w widoku new.rhtml zostalo wygenerowane:

<%= text_field 'entry', 'title' %>

Przy okazji sprawdzilem, ze dzieki stworzonemu w new obiektowi, podczas renderowania widoku new.rhtml mozliwe jest sprawdzenie, czy obiekt posiada metode okreslona w widoku, np. jak title powyzej. Jesli metoda nie istnieje (np. przez pomylke wpiszemy titlee), generowany jest blad. Bez stworzonego obiektu widok pojawi sie i blad zostanie wygenerowny dopiero po wywolaniu create.

To ma jeszcze tę dobrą własność, że po utworzeniu obiektu w “new” możesz mu nadać pewne domyślne wartości (właściwie najlepiej zrobić to w samym modelu, a nie w kontrolerze) i one wtedy zostaną wyświetlone w formularzu edycyjnym.

Przykład: przeglądasz kategorie i chcesz stworzyć nową książkę. Możesz zrobić tak, że nowa książka od razu ma ustawioną kategorię, w której została wywołana akcja “nowa książka”.