Infinite
@Infinite
Developer

Как сделать URL с датой, как на Meduza?

Как сделать URL вот в таком виде https://meduza.io/feature/2016/10/11/sgorevshiy-fl... ?
  • Вопрос задан
  • 147 просмотров
Пригласить эксперта
Ответы на вопрос 2
За формирование урла отвечает метод 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.
Ответ написан
Комментировать
сформировать часть "sgorevshiy-flagman...." поможет gem friendly id
Про дату должно помочь это
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы