Как реализовать вложенные категории Ruby on Rails?
Нужно реализовать вложенные категории по такому патерну url:
domain.com/:category/:subcategory/:item
Причем сделать так, чтобы пользователи могли создавать подкатегорию, но не могли создавать категорию. ( роли и права доступа). Для этой задачи выбрал гем cancancan.
3 модели: категории, подкатегории, итемы. У категории может быть много (has_many) подкатегорий, у подкатегорий много итемов. На каждую модель свои права.
class Category < ApplicationRecord
has_many :subcategories
has_many :items
end
class Subcategory < ApplicationRecord
belongs_to :category
has_many :items
end
class Item < ApplicationRecord
belongs_to :user
belongs_to :category
belongs_to :subcategory
end
class User < ApplicationRecord
has_many :item
end
Александр Хорьков, в SubcategoryController забыли belongs_to :category. И в CategoryController - has_many :items, если вам действительно нужна связь категорий с итемами.
Александр Хорьков, там еще миграции накатить нужно, в общем вам стоит ознакомиться с https://guides.rubyonrails.org/association_basics.html
Роут можете сами собрать, или такой вариант даст стандартный CRUD комплект под ваш формат: /:category_id/:subcategory_id/:id
но его обязательно нужно класть в самый низ routes.rb, чтоб не сломать остальные роуты.
resources :categories, path: '' do
resources :subcategories, path: '' do
resources :items, path: ''
end
end
Тебе нужно сделать так, чтобы пользователи могли создавать подкатегорию, но не могли создавать категорию. Для этого нужно сделать роли и права доступа.
Это и так понятно исходя из моего предположения. Вопрос в том как грамотно реализовать ( пока что без ролей и прав) вложенные категории. Так же на будущее, если вложенность измениться.
Я тралил =_=.. Ненадо парится чтобы сделать что-то сложное. Сделай просто 2 таблицы категории и всё. Так и права будет легче задать.
- categories
- subcategories (category_id)
- items (subcategory_id)
В скобках поля в таблицах
у пользовтелей на создание подкатегории отдельный контроллер, на него легко повесить канкан. Там же на всякий случай рейзишь ошибку если с формы не пришел parent_id.
В форме делаешь селект без пустого значения, или в хидден поле засовываешь категорию или он придет из nested routes. Это уже зависит от интерфейса