开发者

A very basic issue with routes in ruby

I am new 开发者_开发百科to ruby and while creating a sample application found out an issue that whenever I go to http://127.0.0.1:3000/people/index by default show action is executed and index is taken as a parameter. This is server log:

 Started GET "/people/index" for
 127.0.0.1 at 2010-12-23 18:43:01 +0500 Processing by PeopleController#show as
 HTML Parameters: {"id"=>"index"}

I have this in my route file:

root :to => "people#index"   
resources :people
match ':controller(/:action(/:id(.:format)))'

What is going on here and how can I fix the issue?


The route

resources :people

creates "sub"-routes

get    '/people'          => 'people#index'
get    '/people/new'      => 'people#new'
post   '/people'          => 'people#create'
get    '/people/:id'      => 'people#show'
get    '/people/:id/edit' => 'people#edit'
put    '/people/:id'      => 'people#update'
delete '/people/:id'      => 'people#destroy'

Actually, all of these sub-routes include (.:format) at the end of the recognized path.

The path /people/index would be recognized by the route /people/:id, mapping to the action #show.

The path /people would be recognized by the route /people, mapping to the action #index.

Use the URL helpers people_path and people_url for the /people route.

To get Rails to travel backward in time to before it espoused REST and to understand /people/index, do this:

resources :people do
  get :index => 'people#index'
end


You might want to watch this Railscast episode.

A couple things to keep in mind when working with your routes:

  1. rake routes dumps the map of URLs to your controllers
  2. When providing backwards compatibility, redirect the user to the correct path

I personally have yet to upgrade my app to Rails 3, and I'll be dragging my feet until I really need to do it (just got it out the door not too long ago). In Rails 2.x you had resource routes, but if you kept the default controller/action/id route it would fall through and resolve. It appears that is no longer the case in Rails 3. Essentially your resource routes handle all URLs in that resource namespace (/people in your case).

To provide backwards compatibility, I would add a redirect route to resolve that incompatibility.

match "/people/index", :to => redirect("/people")

The main reason for that is to prevent users from saving an incorrect URL for their personal links--while allowing legacy users to still be able to get where they meant to go.

Edit: New answer, removed pointing out the typo in the question.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜