我是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)))'
这里发生了什么,我该如何解决这个问题?
答案 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_path
和people_url
作为/people
路线。
要让Rails在它支持REST并理解/people/index
之前及时向后移动,请执行以下操作:
resources :people do
get :index => 'people#index'
end
答案 1 :(得分:0)
您可能需要观看this Railscast episode。
使用路线时要记住几件事:
rake routes
将URL地图转储到您的控制器我个人还没有将我的应用程序升级到Rails 3,我会拖延我的脚,直到我真的需要这样做(不久前就把它拿出门)。在Rails 2.x中你有资源路由,但是如果你保留了默认的控制器/动作/ id路由,那么它将会通过并解决。在Rails 3中似乎不再是这种情况。本质上,您的资源路由处理该资源名称空间中的所有URL(在您的情况下为/人)。
为了提供向后兼容性,我会添加一个重定向路由来解决这种不兼容问题。
match "/people/index", :to => redirect("/people")
这样做的主要原因是为了防止用户为他们的个人链接保存错误的网址 - 同时允许旧版用户仍然可以到达他们想去的地方。
修改:新答案,删除后指出问题中的拼写错误。