ID + имя пули в URL в Rails (как в StackOverflow) - PullRequest
16 голосов
/ 13 апреля 2010

Я пытаюсь добиться таких URL в Rails:

http://localhost/posts/1234/post-slug-name

с идентификатором и именем пули вместо

http://localhost/posts/1234

или

http://localhost/posts/post-slug-name

(сейчас у меня есть только имя слаг в URL, так что эта часть окончена). Как я могу это сделать?

UPD

Я нашел статью по этому вопросу: http://augustl.com/blog/2009/styling_rails_urls/, вместо /id/slug предлагает использовать /id-slug, который прекрасно мне подходит, поэтому я пойду с этим.

Ответы [ 6 ]

30 голосов
/ 14 апреля 2010

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
9 голосов
/ 14 апреля 2010

Вы захотите добавить обычный маршрут с помощью Route Globbing в дополнение к маршруту вашего ресурса (если, конечно, именно так определены ваши posts маршруты). Например,

map.resources :posts
map.connect '/posts/:id/*slugs', :controller => 'posts', :action => 'show'
7 голосов
/ 09 марта 2011

Использовать friendly_id . У него есть одна приятная особенность: вы можете обновить свой URL, не ломая старый.

Создание URL-адреса просмотра не работает для меня. Я просто добавил небольшой метод в модель

def to_param
  self.friendly_id
end
4 голосов
/ 27 февраля 2016

Я знаю, что вопрос довольно старый, но я думаю, что он все еще заслуживает некоторого интереса, и ни один из ответов не является актуальным или предоставляет способ для точного генерирования того, что ищет ОП (т.е. http://localhost/posts/1234/post-slug-name).

В маршрутах.рб

get 'posts/:id/:slug', to: 'posts#show', as: 'slugged_post'

Тогда в представлениях

<%= link_to slugged_post_path(post, post.name.parameterize) %>

Возможно, вы захотите определить метод slug в вашей модели, чтобы избежать вызова параметризации в представлениях.

0 голосов
/ 16 мая 2012

Я написал пост о слизняках в Rails 3. Он предоставляет красивые URL-адреса и даже больше, защищает ваш сайт от случайных скриптов, которые запрашивают информацию, просто увеличивая ID. Также избегает сохранения слагов в базе данных.

0 голосов
/ 30 апреля 2012

гем stringex содержит ActsAsUrl для создания URI-дружественных представлений атрибута

https://github.com/rsl/stringex

Он также содержит библиотеку Unidecoder, которая может конвертировать Unicode в ASCII.

...