2010-12-09 12 views
2

J'ai un autre moment de rubis nuby et je n'arrive pas à comprendre ce problème simple.Problème de routage Simple Rails

je cela comme une route:

resources :pages 

J'ai dans mon contrôleur pages:

def testy 

end 

et j'ai cela dans app/vues/pages/testy.html.erb

<h1>Testy</h1> 

Je suis en train d'accéder à la page comme ceci: http://localhost:3000/pages/testy

Et je reçois l'erreur suivante:

Couldn't find Page with ID=testy 

Voici le journal:

Started GET "/pages/testy" for 127.0.0.1 at Thu Dec 09 14:24:51 -0600 2010 
Processing by PagesController#show as HTML 
Parameters: {"id"=>"testy"} 
[1m[35mPage Load (0.3ms)[0m SELECT "pages".* FROM "pages" WHERE ("pages"."id" = 0) LIMIT 1 
Completed in 12ms 

ActiveRecord::RecordNotFound (Couldn't find Page with ID=testy): 
app/controllers/pages_controller.rb:11:in `show' 

Il est évident par le journal qu'il essaie d'accéder #show, mais pourquoi? Je pense que c'est un problème avec mon itinéraire. Quelqu'un peut-il me donner un petit pointeur? Je suivais le Rails Guides here et je pense que c'est ce qui me dégoûte "... la règle est que si vous ne rendez pas explicitement quelque chose à la fin de l'action du contrôleur, les rails rechercheront le nom de l'action.http: //www.youtube.com/watch? modèle .erb dans les contrôleurs vue chemin, puis rendre que ... »

+0

double possible de [Création d'une nouvelle action de rails ne fonctionne pas?] (Http://stackoverflow.com/questions/4312477/creating-new -rails-action-doesnt-travail) –

Répondre

5

Lorsque vous configurez une route RESTful comme resources :pages, par quoi que ce soit par défaut après pages/ dans l'URL est mis dans le hachage params comme un code d'identification pages/1 vous donnerait un hachage params qui comprend {:id => '1'} (entre autres choses comme :controller, :action, etc.).

Il existe une exception pour certaines actions telles que pages/new ou pages/edit. Rails est assez intelligent pour savoir que 'new' et 'edit' ne sont pas des IDs. Vous avez juste besoin de dire aux rails que 'testy' n'est pas non plus un ID.

Vous pouvez définir des actions personnalisées à l'aide member ou collection dans un bloc attaché à resources comme ceci:

resources :pages do 
    collection do 
    get :testy # will match pages/testy 
    get :foo 
    post :bar 
    end 

    member do 
    get :baz # will match pages/1/baz 
    end 
end 

rails maintenant Sachez que pages/testy est un itinéraire personnalisé et n'interpréter « grincheux » comme une pièce d'identité.Assurez-vous que les noms de vos itinéraires ne correspondent jamais à votre ID. En d'autres termes, si vous aviez un Page qui avait un ID de testy pour une raison quelconque, vous ne pourriez jamais l'atteindre étant donné les routes ci-dessus!

Pour approfondir la connaissance, je recommande vivement le guide des rails officiels sur les routes: http://guides.rubyonrails.org/routing.html

Type de long, mais vaut vraiment la peine le temps de lire.

+0

collection travaillé (membre n'a pas), merci beaucoup! – jyoseph

+0

@joseph Glad qui a aidé. J'ai mis à jour la réponse pour utiliser 'collection'. – bowsersenior

+0

Je vais bien nidifier plusieurs collections là-bas, n'est-ce pas? Je l'ai fait et cela semble aller. donc 'collection get get: collection testy end get: cal end' – jyoseph

1

dans le fichier de vos itinéraires

resources :pages do 
    get 'test' 
end 

qui fonctionne. remplacer par un poste si nécessaire

0

Puisque les pages sont une ressource, tout ce qui se trouve après dans l'URL sera un id avec les options d'achat d'actions.

Si vous voulez avoir une définition avec « grincheux » comme le nom que vous devez ajouter un named routed à votre routes.rb tels que:

map.test 'testy', :controller => "pages", :action => "test" 

ensuite un lien vers ce que vous devrez appeler <%= link_to "testy", testy_path %>

2

Option 1

resources :pages do 
    collection do 
     get :testy 
    end 
    end 

résultats dans:

testy_pages GET /pages/testy(.:format) {:action=>"testy", :controller=>"pages"} 

Option 2

resources :pages do 
    member do 
     get :testy 
    end 
    end 

résultats dans:

testy_page GET /pages/:id/testy(.:format) {:action=>"testy", :controller=>"pages"} 

Option 3

resources :pages do 
    get :testy 
    end 

résultats dans:

page_testy GET /pages/:page_id/testy(.:format) {:action=>"testy", :controller=>"pages"} 

Tout ces éléments pourraient être utiles, mais je pense que l'option 1 est ce que vous demandez.

1

Ne pas oublier d'exécuter rake routes ou écrire des tests de routage/spécifications

+0

Conseil solide, merci – jyoseph