Rails 4 中自引用关联的路由

Routing for self-referencing association in Rails 4

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

我正在使用 friendly_urls 来获取类别名称而不是 ID。我已经能够使用它的一半来处理这个问题:

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

但是,我尝试让子类别正常工作的一切都失败了?我遇到的唯一答案是为子类别创建另一个 model/controller。如果可能的话,我想避免这种情况,因为它会增加额外的复杂性而收效甚微。我真的不需要单独方法可能提供的任何额外 methods/flexibility。

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

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

假设控制器是列表并且您想将类别名称和子类别名称传递给该控制器索引方法,我将使我的 match|get 路由如下:

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

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

Rails Routing guide 也很有帮助。

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

定义路线:

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