хабраиндекс
104,57

Ruby on Rails: user friendly URLs

В данной статье будет показан пример как сделать красивые ссылки в Rails проекте. Ссылки вида /posts/1/ будут преобразованы в /posts/1-article-name/

Подготовка

Начнем с того что поставим рельсы последней версии, выполнив в консоли gem install rails -v=3.1.3
После окончания процесса установки джема, создаем новый проект командой rails new nice_urls. В результате у нас новый чистый проект со всеми установленными джемами, благодаря тому, что в конце генерации проекта автоматически был запущен bundler.

Создание постов

Для демонстрации нам подойдет обычный скафолдинг. Давайте сгенерируем его для статей у которых будет название и текст:
rails g scaffold Post title:string text:text
Для внесения изменений в БД, выполним миграцию командой rake db:migrate. Теперь можно запускать сервер (команда rails s) и смотреть на то, что у нас сейчас есть по адресу localhost:3000/posts
Перед нами появится привычный интерфейс добавления постов:
post scaffolding

Красивые ссылки

Идем в app/views/posts/index.html.erb и находим строчку, которая формирует ссылку на show:
<%= link_to 'Show', post %>
Здесь post является объектом, который используется при формировании пути. Его стоит заменить такой конструкцией:
post_path(:id => "#{post.id}-#{post.title.parameterize}")
Чтобы протестировать формирование ссылок на действие show, нужно добавить хотя бы одну статью, у которой будет задано название. Давайте воспользуемся интерфейсом для создания постов и назовем его «The test of nice urls». После создания в листинге постов ссылка должна вести уже не на /posts/1, а на /posts/1-the-test-of-nice-urls

Заключение

Конечно же, код на реальном проекте будет отличаться, оборачиваться в хелперы и вызываться в гораздо более удобной форме. Такое решение подойдет не везде и в некоторых ситуациях будет крайне неудобным. Здесь также не учтена вероятность использования кириллицы
–2
29 ноября 2011, 18:02
7
heel 42,0

комментарии (21)

0
vorbiz #
Пипец. Хоть бы мануалы почитал. Скринкасты посмотрел. Нихрена не знают, а лезут ведь статьи писать.
+1
heel #
Не будь троллем, предложи свою реализацию или укажи на явные ошибки той реализации, которую описал я.
+3
eveel #
Задача тривиальна и легко решается при помощи метода to_param у экземпляра ActiveRecord::Base.
+1
heel #
to_param делает URL вида /users/test-user-name
Получается, что поиск идет не по ID а Лайком каким-то, что как бы не слишком хорошо
0
vorbiz #
Энееет, дружищще. to_param делает то, что ему скажешь. В твоём случае —

def to_param
[id, title.parameterize].join('-')
end

Читай внимательно доки.
0
heel #
Ну вот пример с доки на которую выше давали ссылку:

user = User.find_by_name('Phusion')
user_path(user) # => "/users/Phusion"

+1
ciklum_dev #
Уважаемый, есть золотое правило «критикуя, предлагай», в рамках которого вам и предлагаю действовать
0
vorbiz #
Да вот тут настолько тривиальная и всеми отработанная задача, что даже не очень хочется.
Всё равно что я бы написал статью про то, что оказывается в textmate вставляются буковки, если начать тыкать клавиатуру. У меня просто не нашлось слов чтобы описать примитивность темы.
0
heel #
Ну если такие элементарные вещи не стоят твоего внимания, напиши что-то по-лучше и по-умнее. А то пока что я вижу, что ты просто троль, который за три с половиной года на Хабре не написал ни одной статьи и заработал карму минус 20
+1
Vetal4eg #
Хеел, так писать статьи с минусовой кармой нельзя (:
По существу готового решения как всегда нет, но есть статья и гем.
+2
vorbiz #
Да чота как-то писать у меня не очень получается. Да и не о чем. Только хочешь о чём-то написать, погуглишь — а оно уже написано миллион раз, и разжёвано, и даже решения есть лучше, чем можно придумать.

Ок, давай мириться. Я вижу, что ты адекватный человек, просто багажа знаний не хватает. Давай так, я тебе дарю railscasts.com/ вот эту штуку. И ещё вот эту — guides.rubyonrails.org/ (http://rusrails.ru/) Как только ты прочитаешь гайды и просмотришь касты, а райан пишет грамотные касты — у тебя будет достаточно ответов на многие, ещё даже не возникшие вопросы.
+2
heel #
Знаний никогда не бывает достаточно. Про RailsCasts я в курсе, подписан на секцию Pro с самого начала ее появления. Да и guides.rubyonrails.org для меня не новое, пару коммитов туда уже сделал.
+1
vorbiz #
О, вижу коммиты. Ну тогда ты вообще молодец. А я, подлец, на тебя набросился. Но всё-таки какого ты не в курсе про to_param? А рейлскасты про — кака и бесполезно. Надо смотреть именно ранние вещи.
+1
heel #
Не нашел большой разницы между «Про» и «не Про» Рейлкастами. Если смотреть слишком ранние вещи, то бывает несостыковки с текущими версиями или слишком много чего поменялось уже (например, про will paginate или ajax), для этого автор сделал специальную секцию Revised, которая является частью Pro секции, в которой старые касты переписаны с учетом последних тенденций.
+2
atael #
а вот это толково!
предлагаю вам действительно, подумать и предложить что-то свое написать. Мы в Ciklum всегда выступаем за обмен знаниями и опытом, поэтому будем только рады опубликовать.
+1
vorbiz #
Да врядли я соберусь когда-либо ) А если и соберусь — то есть у меня возможности публиковать. Но за предложение спасибо.
0
zayko #
показатель кармы еще не показатель
0
zayko #
С ворбизом не спорить! Он в почёте!
0
heel #
за какие заслуги?
0
zayko #
за гениальную верстку и отличный руби код

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.