ruby中路由的一个非常基本的问题

时间:2010-12-23 13:50:06

标签: ruby-on-rails routes ruby-on-rails-3

我是ruby的新手,在创建示例应用程序时发现了一个问题,即每当我执行http://127.0.0.1:3000/people/index时默认情况下会执行show action并将index作为参数。这是服务器日志:

 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"}

我的路线文件中有这个:

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

这里发生了什么,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

路线

resources :people

创建“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'

实际上,所有这些子路线在识别路径的末尾都包含(.:format)

路径/people/index将识别路径/people/:id,映射到操作#show

路径/people将识别路径/people,映射到操作#index

使用网址助手people_pathpeople_url作为/people路线。

要让Rails在它支持REST并理解/people/index之前及时向后移动,请执行以下操作:

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

答案 1 :(得分:0)

您可能需要观看this Railscast episode

使用路线时要记住几件事:

  1. rake routes将URL地图转储到您的控制器
  2. 提供向后兼容性时,将用户重定向到正确的路径
  3. 我个人还没有将我的应用程序升级到Rails 3,我会拖延我的脚,直到我真的需要这样做(不久前就把它拿出门)。在Rails 2.x中你有资源路由,但是如果你保留了默认的控制器/动作/ id路由,那么它将会通过并解决。在Rails 3中似乎不再是这种情况。本质上,您的资源路由处理该资源名称空间中的所有URL(在您的情况下为/人)。

    为了提供向后兼容性,我会添加一个重定向路由来解决这种不兼容问题。

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

    这样做的主要原因是为了防止用户为他们的个人链接保存错误的网址 - 同时允许旧版用户仍然可以到达他们想去的地方。

    修改:新答案,删除后指出问题中的拼写错误。