#ruby_on_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 Как это сделать?
Ответы
Ответ 1
Я так понимаю, вас больше интересует разбор ссылок, то есть, роутинг. Если делать наивно, рельсово, ресурсно, то получится поначалу такое (чтобы было удобнее смотреть вывод 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 полезен для генерации "хвостов" из пользовательского ввода.Ответ 2
Если я правильно понял, тебе нужно что-то типа friendly_id
Комментариев нет:
Отправить комментарий