Страницы

Поиск по вопросам

четверг, 7 марта 2019 г.

Роуты и категории rails

Есть post и post_category, post_category связана с post по post_category_id
class Post < ActiveRecord::Base belongs_to :post_category end
class PostCategory < ActiveRecord::Base has_many :posts end
Есть категория к примеру Еда, при добавлении категории есть поле seo_url
К примеру:
"Еда" seo_url "food"
Я хочу для начала получить ссылку на посты вида^
site.ru/food/13
Как это сделать?


Ответ

Я так понимаю, вас больше интересует разбор ссылок, то есть, роутинг
Если делать наивно, рельсово, ресурсно, то получится поначалу такое (чтобы было удобнее смотреть вывод rake routes, я добавил only: [:show], можно потом убрать):

resources :post_categories, only: [:show] do resources :posts, only: [:show] end # Категория: /post_categories/:id # Пост: /post_categories/:post_category_id/posts/:id
Сначала уберём хвосты, ресурсы в множественном числе. Это просто, resources принимает опцию :path, которая отвечает именно за это. По умолчанию это имя ресурса. А если поставить там пустую строку, то весь сегмент "схлопнется":
resources :post_categories, path: '', only: [:show] do resources :posts, path: '', only: [:show] end # Категория: /:id # Пост: /:post_category_id/:id
Это довольно опасно, поскольку под эти две маски подходит вообще любой путь из одного и двух сегментов соответственно. Именно поэтому path по умолчанию непустой, он служит "маркером" того, что ссылка относится к ресурсу. Если его убрать — удостоверьтесь, что этот паттерн не "съел" (сделал недоступными) другие ваши маршруты. Для этого, например, можно разместить этот блок как можно ниже, ведь чем выше маршрут, тем выше его приоритет и тем раньше проверяется совпадение с ним.
Косметика
В рельсах принято под идентификатором/ключом вида <...>_id хранить значение первичного ключа обозначаемой модели. Поскольку на категорию вы будете ссылаться по её "хвосту" (предпочитаемый мной перевод slug), есть смысл переименовать соответствующий параметр. Запросто. Опция называется, неожиданно, :param
resources :post_categories, path: '', param: :name, only: [:show] do resources :posts, path: '', only: [:show] end # Категория: /:name post_categories#show # Пост: /:post_category_name/:id posts#show
Мелкие детали
В модели есть смысл реализовать to_param для генерации ссылок хелперами. В контроллерах есть смысл выделить получение записи в before_action friendly_id полезен для генерации "хвостов" из пользовательского ввода.

Комментариев нет:

Отправить комментарий