2015-04-21 5 views
0

Я пытаюсь настроить маршрут для самостоятельной привязки вложенной ассоциации. Цель состоит в том, чтобы получить URL-адрес /category_name/subcategory_name.Маршрутизация для самореференционной ассоциации в Rails 4

Я использую friendly_urls для получения имен категорий вместо идентификаторов. Я был в состоянии получить половину его, чтобы работать с этим:

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

Однако, все, что я пытаюсь получить подкатегорию для работы не удается? Единственные ответы, с которыми я столкнулся, - создать еще одну модель/контроллер для подкатегорий. Если возможно, я бы хотел этого избежать, так как это добавит дополнительную сложность для небольшого выигрыша. Мне не нужны никакие дополнительные методы/гибкость, которые могут предоставить отдельные методы.

Это мое первое приложение Rails, поэтому, пожалуйста, извините основную суть этого вопроса.

ответ

1

Если бы я тебя, я делаю так:

Определить маршруты:

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 
0

Не видя файл маршрутов или окончательно зная имя контроллера (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 тоже очень полезно.

Смежные вопросы