Есть 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 полезен для генерации "хвостов" из пользовательского ввода.
Комментариев нет:
Отправить комментарий