我正在尝试为自引用嵌套关联设置路由。目标是获取/category_name/subcategory_name
的网址。
我正在使用friendly_urls获取类别名称而不是ID。我已经能够将其中的一半用于此:
match '/:id' => 'listing#index', :via => 'get', as: 'category'
然而,我尝试让子类别工作的一切都失败了?我遇到的唯一答案是为子类别创建另一个模型/控制器。如果可能的话,我想避免这种情况,因为它会增加额外的复杂性以获得微不足道的收益。我真的不需要单独方法可能提供的任何额外方法/灵活性。
这是我的第一个Rails应用程序,请原谅这个问题的基本性质。
答案 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也非常有帮助。