在Rails 3中处理has_one嵌套资源

3

我有一个用户模型和一个关于模型。关于模型是一个页面,用户可以在其中获取更多关于自己的信息,由于其特性更适合放在单独的模型中而不是用户模型中。

我希望能够将其路由到类似于 /: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进行POST或PUT操作时,它被解释为展示(show)。
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个回答

11

当使用has_one时,将其作为单数资源在路由中声明可能是有意义的。这意味着

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

如果你想覆盖新建和编辑的路径,可以在resource/resources调用中添加:path_names选项:

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

官方文档还有许多其他关于路由的技巧和提示。


这就是我一直在寻找的。 - Vitaliy Yanchuk
这个答案更符合 Rails 风格。 - user2422869

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

这就是我一直在寻找的! - Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接