Подтвердить что ты не робот

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, который отлично работает для меня, поэтому я пойду с этим.

4b9b3361

Ответ 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. Кроме того, он избегает сохранения пули в базе данных.