在Rails 4中进行自引用关联的路由

时间:2015-04-21 18:02:53

标签: ruby-on-rails routes self-reference nested-routes

我正在尝试为自引用嵌套关联设置路由。目标是获取/category_name/subcategory_name的网址。

我正在使用friendly_urls获取类别名称而不是ID。我已经能够将其中的一半用于此:

match '/:id' => 'listing#index', :via => 'get', as: 'category'

然而,我尝试让子类别工作的一切都失败了?我遇到的唯一答案是为子类别创建另一个模型/控制器。如果可能的话,我想避免这种情况,因为它会增加额外的复杂性以获得微不足道的收益。我真的不需要单独方法可能提供的任何额外方法/灵活性。

这是我的第一个Rails应用程序,请原谅这个问题的基本性质。

2 个答案:

答案 0 :(得分:3)

如果我是你,我会这样做:

定义路线:

resources :categories do
  resources :categories, path: '/'
end

rake routes显示:

   category_categories GET    /categories/:category_id(.:format)          categories#index
                       POST   /categories/:category_id(.:format)          categories#create
 new_category_category GET    /categories/:category_id/new(.:format)      categories#new
edit_category_category GET    /categories/:category_id/:id/edit(.:format) categories#edit
     category_category GET    /categories/:category_id/:id(.:format)      categories#show
                       PATCH  /categories/:category_id/:id(.:format)      categories#update
                       PUT    /categories/:category_id/:id(.:format)      categories#update
                       DELETE /categories/:category_id/:id(.:format)      categories#destroy
            categories GET    /categories(.:format)                       categories#index
                       POST   /categories(.:format)                       categories#create
          new_category GET    /categories/new(.:format)                   categories#new
         edit_category GET    /categories/:id/edit(.:format)              categories#edit
              category GET    /categories/:id(.:format)                   categories#show
                       PATCH  /categories/:id(.:format)                   categories#update
                       PUT    /categories/:id(.:format)                   categories#update
                       DELETE /categories/:id(.:format)                   categories#destroy

categories_controller上,您可以识别嵌套类别(子类别),因为params[:category_id]不是nil。如果是nil,则该操作适用于父类别。

修改 添加了path选项。

我想你想要这个:

   category_categories GET    /:category_id(.:format)          categories#index
                       POST   /:category_id(.:format)          categories#create
 new_category_category GET    /:category_id/new(.:format)      categories#new
edit_category_category GET    /:category_id/:id/edit(.:format) categories#edit
     category_category GET    /:category_id/:id(.:format)      categories#show
                       PATCH  /:category_id/:id(.:format)      categories#update
                       PUT    /:category_id/:id(.:format)      categories#update
                       DELETE /:category_id/:id(.:format)      categories#destroy
            categories GET    /                                categories#index
                       POST   /                                categories#create
          new_category GET    /new(.:format)                   categories#new
         edit_category GET    /:id/edit(.:format)              categories#edit
              category GET    /:id(.:format)                   categories#show
                       PATCH  /:id(.:format)                   categories#update
                       PUT    /:id(.:format)                   categories#update
                       DELETE /:id(.:format)                   categories#destroy

你必须在外线上做同样的事情:

resources :categories, path: '/' do
  resources :categories, path: '/'
end

答案 1 :(得分:0)

没有看到你的路由文件或明确知道控制器的名称(listing应该是listings,因为Rails控制器通常是复数,除非你有意识地命名你的控制器listing )。

假设控制器是列表,并且您希望将类别名称和子类别名称传递给该控制器索引方法,我将使match|get路由成为以下内容:

get '/:category_name/:subcategory_name', to: 'listings#index', as: 'category'

然后,在ListingsController的index方法中,我可以(假设它们被提供)检查params[:category_name]params[:subcategory_name]并相应地对它们采取行动。

Rails Routing guide也非常有帮助。