Witam,
No więc tworzę nową aplikację według jakiegoś tutoriala, na razie wszystko było ok, mam modele book i subject i viewy do wyswietlania /book/list , /edit, /new. Moge dodać do bazy nową książkę. Problem pojawił się podczas tworzenia viewa do Edit. Gdy wpisuję w formularzu dane i klikam guzik save changes wyskakuje mi Routing error : no route matches /book/2 lub book/3 zależnie od tego którą książkę na liście edytowałem. Gdy ręcznie wpisuję link localhost:3000/book/2 np to wszystko działa i wyświetla viewa pokazującego dane 2 książki. W moim pliku routing mam tylko takie 4 linijki:
root :to => “home#index”
match “/book/list” => “book#list”
match “/book/new” => “book#new”
resources :book
Dołączam zdjęcie jak wyglądają moje pliki BookController ( funkcja update ), edit.rhtml i new.rhtml który działa i tworzy nową książkę w bd oraz output z consoli servera webricka po nacisnięciu Save Changes (Started Post na samym dole).
PS. Własnie pojawił się następny dość dziwny problem z którym nie mogę sobie poradzić. Po dopisaniu do rhtml viewa list bloku dodającego guzik delete z linkiem do metody delete z controlera book wyskakuje mi ActionController::RoutingError in Book#list
No route matches {:action=>“delete”, :id=>1, :controller=>“book”}
Extracted source (around line #9):
Guzik Edit który był już wcześniej działa prawidłowo, oraz gdy zmienie w tym bloku Delete akcję na action => ‘edit’ zamiast ‘delete’ to stronka sie odswiea i wydać guzik. Proszę o pomoc bo nie do końca rozumiem cały ten routing w railsach :(.
Pozdrawiam
Własnie dziwne jest to że gdy miałem resources :book i te pozostałe 2 linijki kodu to stronki mi działy, gdy próbowałem wcześniej zmieniać na :books to wszystko przestawało działać i była masa routing errorów, a w każdym tutku widziałem, że pisane jest w pluralu (books).
Zmieniłem teraz plik routing na taki :
root :to => “home#index”
match “/book/create” => “book#create”
match “/book/list” => “book#list”
match “/book/new” => “book#new”
match “/book/show” => “book#show”
match “/book/edit” => “book#edit”
match “/book/update” => “book#update”
match “/book/delete” => “book#delete”
i wszystko działa normalnie, dwa problemy o których pisałem przed chwilą znikły, nasuwa mi się więc pytanie dlaczego polecenie resources :books mi nie tworzy automatycznie routów do tych wszystkich metod controlera ?
Nie rozumiem ? Co i dlaczego nazwałem źle ? W totorialu było napisane, że model należy nazwac w pojedyńczej formie, nazwałem Book, i Controller też nazwałem Book
marr … Wiem, że wszystko o routingu się pozmieniało ale pytałem o standarty ruby on rails 3 i o nazewnictwo Modeli i kontrolerów … Czy z w liczbie mnogiej czy pojedynczej.
Nie o to chodzi ze nie moze, powinienes go nazwac w pojedynczej a z tego powinna sie zrobic wersja mnoga z automatu, chyba ze masz to jako singlurar czy inne cuda. Ale sie nie zrobilo. Wielkiej szkody nie ma mozna sobie z tym poradzic, ale trzeba troche sie pobawic np routy sa inne maja np postac book_index_path i formularze z automatu tez nie pojda i pewnie jeszcze kilka innych rzeczy
Jak kiedyś będziesz robił jeszcze i zobaczysz że kontroler nie ma ‘s’ na końcu a nie robiłeś tego specjalnie powinna się zapalić lampka.
Czyli mój kontroler powinien nazywać się books_controller ? U mnie jest book_controller nazwa pliku .rb natomiast nazwa klasy w środku jest
class BookController < ApplicationController
I tak mi się stworzyło automatycznie w ruby 3 po wpisaniu rails g controller Book.
Nie tyle się źle zrobiło, tylko źle wpisałeś - kontrolery od zawsze (również we wcześniejszych wersjach) powinny być nazywane w liczbie mnogiej.
Zobacz zresztą efekt użycia
rails g scaffold Book title:string
To tworzy zarówno model jak i kontroler, używając domyślnych konwencji Railsów.
Ten tutorial jest dla wersji Rails 1.2.x. Aktualna wersja to 3.0.3, zmieniło się bardzo dużo, prawdopodobnie powinieneś poszukać czegoś bardziej aktualnego. Z drobnych rzeczy które udało mi się wyłapać:
kontrolery od zawsze były nazywane liczbą mnogą. To jest błąd w tutorialu.
akcja “list” w kontrolerach została zastąpiona akcją “index” od Rails 2.x
Rails 3 mają nową składnię dla interakcji z bazą danych, “Book.find(:all)” jest przestarzałe
akcja “delete” została przemianowana na “destroy”
sposób tworzenia formularzy jest inny niż podany (już nieaktualny)