За формирование урла отвечает метод to_param в ActiveRecord модели.
Для примера из meduza метод to_param выглядел бы примерно следующим образом
class Article < ...
# ...
def to_param
"#{created_at.year}/#{created_at.month}/#{created_at.day}/#{transliterated_title}"
end
# ..
end
Но одного этого недостаточно, чтобы всё начало работать. В контроллере теперь нужен какой-то механизм, который сможет по строке "2016/10/11/sgorevshiy-flagman-perezhivet-li-samsung-proval-s-galaxy-note-7".
И тут есть два варианта.
1. В первом варианте в методе to_param добавляется id к строке вот так
def to_param
"#{created_at.year}/#{created_at.month}/#{created_at.day}/#{id}-#{transliterated_title}"
end
или вот так
def to_param
"#{created_at.year}/#{created_at.month}/#{created_at.day}/#{transliterated_title}-#{id}"
end
В таком случае в контроллере извлекаем из строки id и ищем по нему модель в базе.
2. Во втором варианте в модель добавляется поле, которое обычно называют либо permalink, либо slug. И в модели в before_save колбеке заполнятся это поле.
before_save :update_slug
private
def update_slug
self.slug = to_param
end
После чего в контроллере можно искать модель по строке.
Лично я предпочитаю первый способ, т.к. он проще, особенно, если id размещать в самом начале строки вот так
def to_param
"#{id}-#{transliterated_title}"
end
Тут поиск модели превращается в обычный find.
@resource = Article.find params[:id].to_i
Для автоматизации второго способа есть гемы
permalink и
friendly_id.