Подтвердить что ты не робот

Rails slugs в URL-адресе - с использованием атрибута заголовка позиции Active Record вместо идентификатора

Я пытаюсь создать URL-адреса Rails для показа записей, используя их название вместо их ID в 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-адрес заголовка сохраняется в базе данных в столбце slug.

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

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

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

Я экстремальный newb - где я должен его определять?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

class Post < ActiveRecord::Base
  acts_as_url :title
end

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

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

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

Ответ 3

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

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

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

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