Problem z routingiem i metodą update

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

http://img152.imageshack.us/i/print1g.jpg/

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

6: <% @books.each do |c| %>
7:


  • 8: <%= link_to c.title, {:action => ‘show’, :id => c.id} -%>
    9: <%= link_to ‘Edit’, {:action => ‘edit’, :id => c.id} %>
    10: <%= link_to ‘Delete’, {:action => ‘delete’, :id => c.id},
    11: :confirm => “Are you sure you want to delete this item?” %>

    12:
  • 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

    Spróbuj zamienić resources :book na resources :books

    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 ?

    To nic nie da, na obrazku widać że dałeś ciała i źle nazwałeś model (kontroler) i tak dalej dałeś book zamiast books. Przynajmniej tak to wygląda.


    Edit

    To znalazłeś rozwiązanie ;]

    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

    a powinien się nazywać books (kontroler) gotar ma rację

    Czy tak jest od wersji 3 ruby ? Bo ten tutorial do ruby 2 bodajże wyraźnie podaje że kontroler należy nazwać w liczbie pojedyńczej:

    Notice that you are capitalizing Book and using the singular form. This is a Rails paradigm that you should follow each time you create a controller.

    Czy to się zmieniło w ruby 3? Czy ten tutek jest błędny ? wygląda na dość solidny ;p http://www.tutorialspoint.com/ruby-on-rails/index.htm

    “everything you knew about working with routes in Rails 2… is history!” => http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/

    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.

    no to się źle zrobiło powinno być z s na końcu wtedy automagocznie wszystko zacznie działać

    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)

    Pewnie jeszcze sporo by się znalazło. To wszystko drobiazgi, ale utrudniasz sobie życie. Może spróbuj zacząć od http://guides.rubyonrails.org/getting_started.html ?

    Also: Ruby != Rails, Ruby to język, Rails to framework oparty na języku Ruby.