Rails-слагы в URL - используя вместо заголовка атрибут заголовка публикации Active Record Model Model - PullRequest
36 голосов
/ 10 августа 2009

Я пытался заставить мои Rails создавать URL для отображения записей, используя их заголовок вместо идентификатора в URL, например:

/ сообщений / а-пост-о-ракеты

После онлайн-урока я сделал следующее:


Поскольку идентификатора больше нет в URL, мы должны немного изменить код.

class Post < ActiveRecord::Base
  before_create :create_slug

  def to_param
    slug
  end

  def create_slug
    self.slug = self.title.parameterize
  end
end

При создании сообщения URL-версия заголовка сохраняется в базе данных в столбце слаг.

Мы также должны обновить результаты поиска, чтобы найти записи, используя столбец слагов вместо идентификатора.

class ProjectsController < ApplicationController
  def show
    @project = Project.find_by_slug!(params[:id])
  end
end

На данный момент это работает, кроме показа записи, потому что find_by_slug! еще не существует

Я крайний новичок - где мне его определять?

Ответы [ 3 ]

19 голосов
/ 19 сентября 2009

Это не обязательно прямой ответ на ваш вопрос, но вы смотрели на плагин Stringex (http://github.com/rsl/stringex)? Это отличный способ автоматически создавать слагов для ваших записей.

Вы можете просто добавить в свою модель что-то вроде следующего:

class Post < ActiveRecord::Base
  acts_as_url :title
end

и он автоматически создаст слагов из вашего заголовка и сохранит их в столбце слагов.

Он также очень умный в том, как он создает слизней. Например, заголовок «Скидка 10%, только сегодня» превращается в «Скидка 10% только сегодня».

Довольно гладко!

13 голосов
/ 10 августа 2009

find_by_foo - это не то, что вам нужно определить. ActiveRecord возьмет это за вас, если у вас есть столбец с именем "foo". Добавление восклицательного знака, как вы сделали, вызовет исключение, если запись не найдена, в отличие от возврата нуля без исключения, если вы не используете восклицательный знак.

Что касается вашей конкретной проблемы, вы добавили свою слаг в Post, но вы пытаетесь искать в Project.

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

Stringex gem отлично подходит для генерации самого слага, но я не согласен с тем, что сохранение его в базе данных - хорошая идея Вы должны помнить, что если что-то, относящееся к слагу, изменится, вам нужно обновить столбец слага. E соответствует.

В конце концов, это дублированная информация, независимо от того, в какой форме. Я написал пост именно по этой причине.

http://blog.ereslibre.es/?p=343

Надеюсь, пост поможет вам. Я пытался объяснить все там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...