在Rails 3中处理has_one嵌套资源

时间:2011-02-27 18:47:31

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

我有一个User模型和一个About模型。 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

当我正在做一个帖子或放到/ 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

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

将此归档的最简单,最简洁的方法是什么?

2 个答案:

答案 0 :(得分:11)

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

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

如果要覆盖新/编辑的路径,请在资源/资源调用中添加:path_names选项:

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

official documentation还有许多其他提示和技巧用于路由。

答案 1 :(得分:4)

您可以使用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"}