ID + Slug name в URL в Rails (например, в StackOverflow)
Я пытаюсь получить такие URL-адреса в Rails:
http://localhost/posts/1234/post-slug-name
с именем ID и slug вместо
http://localhost/posts/1234
или
http://localhost/posts/post-slug-name
(прямо сейчас у меня есть только имя слитка в URL-адресе, поэтому эта часть закончилась). Как я могу это сделать?
UPD
Я нашел статью по этому поводу: http://augustl.com/blog/2009/styling_rails_urls/, вместо /id/slug
предлагается использовать /id-slug
, который отлично работает для меня, поэтому я пойду с этим.
Ответы
Ответ 1
Вам нужно добавить обычный маршрут с Route Globbing в дополнение к вашему маршруту ресурсов (предполагая, конечно, что ваш posts
маршруты определены). Например,
map.resources :posts
map.connect '/posts/:id/*slugs', :controller => 'posts', :action => 'show'
Ответ 2
Rails имеет встроенную поддержку для SEO дружественных URL-адресов.
Вы можете создать URL-адрес в форме: "id-title", просто переопределив метод to_param в вашей модели.
Это из одного из моих проектов и создает URL-адрес с идентификатором, именем категории и именем модели:
def to_param
"#{id}-#{category.name.parameterize}-#{name.parameterize}"
end
Rails достаточно умен, чтобы извлечь это обратно в простой идентификатор при доступе к действию вашего контроллера, поэтому следующее работает:
def show
@model = Model.find(params[:id])
render :action => "show"
end
Ответ 3
Используйте friendly_id. У него есть одна приятная функция: вы можете обновить свой url, не нарушая старый.
Сгенерированный URL-адрес представления не работает для меня. Я просто добавил небольшой метод в модель
def to_param
self.friendly_id
end
Ответ 4
Я знаю, что вопрос довольно старый, но я думаю, что он по-прежнему заслуживает некоторого интереса, и ни один из ответов не является актуальным или не дает способ генерировать то, что ищет OP (т.е. http://localhost/posts/1234/post-slug-name
).
В routes.rb
get 'posts/:id/:slug', to: 'posts#show', as: 'slugged_post'
Тогда в представлениях
<%= link_to slugged_post_path(post, post.name.parameterize) %>
Возможно, вы захотите определить метод slug в своей модели, чтобы избежать вызова параметризации в представлениях.
Ответ 5
stringex gem содержит ActsAsUrl для создания URI-дружественных представлений атрибута
https://github.com/rsl/stringex
Он также содержит библиотеку Unidecoder, которая может конвертировать Unicode в ASCII.
Ответ 6
Я написал сообщение о пули в Rails 3. Он предоставляет довольно URL и даже больше, защищает ваш сайт от случайных скриптов, запрашивающих информацию просто увеличив ID. Кроме того, он избегает сохранения пули в базе данных.