Страницы

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

воскресенье, 12 января 2020 г.

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

#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

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

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