2010-10-21 12 views
1

Je suis confronté à mon premier RoR tutorial et j'ai rencontré une erreur de routage du contrôleur d'action. J'ai vérifié mon code au moins 8 fois, mais je n'arrive pas à comprendre le problème. Je suis sûr que cela se reproduira à l'avenir. Ma question est, en général, comment devrais-je résoudre ces erreurs? Si c'est pertinent, j'utilise RVM, Rails 3.0.1 et Ruby 1.9.2.Recherche des erreurs de routage dans les rails

Pour référence à ce que je traite actuellement, voici quelques-uns des fichiers:

pages_controller.rb

class PagesController < ApplicationController 
    def home 
    @title = "Home" 
    end 

    def contact 
    @title = "Contact" 
    end 

    def about 
    @title = "About" 
    end 

    def help 
    @title = "Help" 
    end 
end 

layout_links_spec.rb

require 'spec_helper' 

    describe "LayoutLinks" do 

     it "should have a Home page at '/'" do 
     get '/' 
     response.should have_selector('title', :content => "Home") 
     end 

     it "should have a Contact page at '/contact'" do 
     get '/contact' 
     response.should have_selector('title', :content => "Contact") 
     end 

     it "should have an About page at '/about'" do 
     get '/about' 
     response.should have_selector('title', :content => "About") 
     end 

     it "should have a Help page at '/help'" do 
     get '/help' 
     response.should have_selector('title', :content => "Help") 
     end 
    end 

routes.rb

SampleApp::Application.routes.draw do 
    match '/contact', :to => 'pages#contact' 
    match '/about', :to => 'pages#about' 
    match '/help', :to => 'pages#help' 

    root :to => 'pages#home' 
end 

Sortie Terminal

Started GET "/pages/home" for 127.0.0.1 at 2010-10-21 06:51:01 -0400 

ActionController::RoutingError (No route matches "/pages/home"): 


Rendered /Users/zak/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.1/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (0.8ms) 

a également couru rake routes et obtenu

ZKidds-MacBook-Pro:sample_app zak$ rake routes 
(in /Users/zak/rails_projects/sample_app) 
contact /contact(.:format) {:controller=>"pages", :action=>"contact"} 
    about /about(.:format) {:controller=>"pages", :action=>"about"} 
    help /help(.:format) {:controller=>"pages", :action=>"help"} 
    home /home(.:format) {:controller=>"pages", :action=>"home"} 

Répondre

1

Vous ne disposez pas d'un itinéraire pour /pages/home définie nulle part. Vous avez seulement la racine correspondante / à PagesController et sa méthode home. Donc demander / fonctionnera, mais /pages/home pas.

Soit vous devez définir:

match "/pages/home" => "pages#home" 

ou ajouter Pages de ressources avec méthode supplémentaire home:

resources :pages do 
    get "home", :on => :collection 
end 

dont voici quelques ressources de routage utiles:

+0

J'ai fait ce changement dans le layout_links_spec.fichier rb: require 'spec_helper' décrivent "LayoutLinks" faire il "devrait avoir une page d'accueil à '/ home'" faire get '/ home' response.should have_selector ('title',: content = > "Home") fin Et mon pages_controller.rb a: classe PagesController zkidd

+0

votre test dans le commentaire correspond maintenant à votre 'râteau sortie routes'. Mais les deux ne correspondent pas à 'routes.rb' ** dans la question **. Où est votre correspondance pour '/ home'? – Matt

1

Comme @Matt dit, vous n'avez pas défini un itinéraire /pages/home, il est seulement adapté à /. Le meilleur conseil que je peux vous donner lorsque vous traitez des problèmes de routage est d'exécuter rake routes dans le terminal (où vous exécuterez rails server etc.), qui affiche une liste de tous les itinéraires reconnus pour votre application.

+0

Je pensais avoir routé la page d'accueil avec "root: to => 'pages # home'" – zkidd

+0

Vous avez routé '/' (root) vers l'action 'home' de' PagesController'. Il n'y a aucune mention de '/ pages/home', donc rails ne sait pas comment gérer cette URL. Gardez à l'esprit que plusieurs URL peuvent être routées vers la même paire contrôleur/action. – Jeriko