В вашем комментарии первая часть выглядит нормально: добавьте столбец к столбцу «Публикация» с именем slug
и т. Д., И его содержимое станет частью или полностью URL-адреса, используемого для отображения определенного сообщения.(Я предполагаю, что другие операции CRUD должны работать как обычно)
Чтобы найти URL, маршрутизатор должен знать, как узнать, какой контроллер и действие будет обрабатывать этот URL (по сравнению с другими).Обычный маршрут resources :posts
будет соответствовать всем методам RESTful, например, отображение запроса GET на путь, начинающийся с имени контроллера, и, если указан идентификатор (/posts/1
), сопоставляется с методом контроллера posts#show
, если нет, он будет соответствовать методу posts#index
.Если запрос представляет собой PUT, или DELETE, или POST, произойдут различные действия в отношении стандартного формата URL.
Требуются два изменения:
- URL с форматом post slug должен:сопоставьте с методом
posts#show
(который изменяется соответствующим образом) и - Любые ссылки на страницу
show
, созданные на вашем сайте, должны использовать почтовый слаг вместо идентификатора
Я предполагаю, что вы в порядке с URL-адресами, начинающимися с /posts
(если нет, вам нужно будет определить какой-то другой уникальный шаблон).
Первое изменение требует переопределения определенногоВ случае метода show, использующего маршрутизацию, я добавил что-то вроде match 'posts/*slug
перед стандартным маршрутом ресурса.Вот ссылка на руководство по сбору маршрутов: http://guides.rubyonrails.org/routing.html#route-globbing
Следующее изменение, измените существующий метод posts#show
, чтобы он искал slug
вместо id
, например,
def show
@post = Post.where("slug = ?", params[:slug])
...
end
Наконец, измените способ, которым Rails обрабатывает URL-помощник posts_path
.Сделайте это, переопределив to_param
в вашей модели Post, например,
def to_param
"/posts/#{slug}"
end
И тогда все готово.Может быть.
После этого посмотрите, как гем friendly_id делает то же самое :-) https://github.com/norman/friendly_id