On Rails 4.2, я хотел бы использовать Friendly Id для маршрутизации к определенной модели, но не хочу создавать столбцы slug в таблице модели. Вместо этого я предпочел бы использовать метод доступа на модели и динамически генерировать пул. Это возможно? Я не мог найти это в documentation.Могу ли я использовать идентификатор Friendly Id в Rails без создания столбца slug в таблице модели?
Могу ли я использовать идентификатор Friendly Id в Rails без создания столбца slug в таблице модели?
ответ
Вы не можете сделать это напрямую, используя дружественный идентификатор из-за того, как он использует slug для запроса базы данных (relevant source).
Однако не сложно выполнить то, что вы хотите. Что вам нужно будет два метода:
Model#slug
метод, который даст вам тихоход для конкретной моделиModel.find_by_slug
метод, который будет генерировать соответствующий запрос для конкретного слизня.
Теперь в ваших контроллерах вы можете использовать Model.find_by_slug
, чтобы получить соответствующую модель из параметров пути. Однако осуществление этого метода может быть сложно, особенно если ваш Model#slug
использует необратимый реализацию пробок, как Slugify, потому что он просто получить освобождается от непризнанных символов в тексте и нормализует несколько вещей, чтобы тот же характер (например, _ и -. В -)
Вы можете использовать URI::Escape.encode
и URI::Escape.decode
, но в итоге вы получите несколько уродливых слизней.
Как обсуждалось here Я пошел со следующим подходом для пользовательской маршрутизации на основе динамического slug.
Я хочу собственный маршрут, как это: /foos/the-title-parameterized-1
(где «1
» является id
из Foo
объекта).
Foo
модель:
#...
attr_accessor :slug
#dynamically generate a slug, the Rails `parameterize`
#handles transforming of ugly url characters such as
#unicode or spaces:
def slug
"#{self.title.parameterize[0..200]}-#{self.id}"
end
def to_param
slug
end
#...
routes.rb
:
get 'foos/:slug' => 'foos#show', :as => 'foo'
foos_controller.rb
:
def show
@foo = Foo.find params[:slug].split("-").last.to_i
end
В моей show
зрения, я могу использовать метод foo_path
вспомогательный URL-адрес по умолчанию.
Не совсем - если вам нужно динамически вычислять «slug» в Ruby, это означает, что вы не можете запрашивать записи на основе пули. Вам нужно было бы вытащить все и разобраться в рубине. То, что вы хотите, скорее всего, является обычным методом для создания пули. – max
Спасибо @max, я подозревал, что именно поэтому я задал еще один вопрос, связанный с созданием настраиваемого метода для создания пули: http://stackoverflow.com/questions/41658221/rails-routing-using-custom-attribute-rather- чем-таблицы-колонки – joshweir