Задать вопрос
Infinite
@Infinite
Developer

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

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

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

Похожие вопросы
OTKLIK POWER Москва
от 80 000 до 150 000 ₽
от 6 000 до 8 000 $
Netwrk Буэнос-Айрес
от 5 000 до 7 500 $