在Rails 3中处理has_one嵌套资源

我有一个用户模型和一个关于模型。 about模型是一个页面,用户可以在其中获得更多关于它们的信息,因为它本质上更适合将其放在单独的模型而不是用户模型中。

我希望能够将它路由到/:username / about之类的东西,并获取在该路径上工作的所有动词(GET POST,PUT,DELETE)。

/:username/about /:username/about/edit /:username/about 

这就是我已经拥有的

 # routes.rb resources :users do resources :abouts end match ':username/about' => 'abouts#show', :as => :user_about match ':username/about/add' => 'abouts#new', :as => :user_new_about match ':username/about/edit' => 'abouts#edit', :as => :user_edit_about 

在我的模型中

 # about.rb belongs_to :user # user.rb has_one :about 

当我正在做一个post或放到/ roses / about它将它解释为一个节目

 Started POST "/roses/about" for 127.0.0.1 at Sun Feb 27 16:24:18 -0200 2011 Processing by AboutsController#show as HTML 

我可能错过了路由中的声明,但是当它与默认值不同时,它是否会为资源声明每个动词?

存档这个最简单,最简洁的方法是什么?

您可以使用scopecontroller块来减少措辞:

  scope "/:username" do controller :abouts do get 'about' => :show post 'about' => :create get 'about/add' => :new get 'about/edit' => :edit end end 

产生:

  about GET /:username/about(.:format) {:action=>"show", :controller=>"abouts"} POST /:username/about(.:format) {:action=>"create", :controller=>"abouts"} about_add GET /:username/about/add(.:format) {:controller=>"abouts", :action=>"new"} about_edit GET /:username/about/edit(.:format) {:controller=>"abouts", :action=>"edit"} 

使用has_one ,将它声明为路由中的单一资源可能是有意义的。 含义

 resources :users do resource :about # notice "resource" and not "resources" end 

如果要覆盖new / edit的路径,请在resource / resources-call中添加:path_names选项:

resources :about, :path_names => { :new => 'add', :edit => 'edit' }

官方文档还有很多其他的路由技巧和窍门。