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 - где я должен его определять?
Ответы
Ответ 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
Я надеюсь, что эта почта поможет. Я пытался все объяснить.