2017-01-15 2 views
1

On Rails 4.2, я хотел бы использовать Friendly Id для маршрутизации к определенной модели, но не хочу создавать столбцы slug в таблице модели. Вместо этого я предпочел бы использовать метод доступа на модели и динамически генерировать пул. Это возможно? Я не мог найти это в documentation.Могу ли я использовать идентификатор Friendly Id в Rails без создания столбца slug в таблице модели?

+1

Не совсем - если вам нужно динамически вычислять «slug» в Ruby, это означает, что вы не можете запрашивать записи на основе пули. Вам нужно было бы вытащить все и разобраться в рубине. То, что вы хотите, скорее всего, является обычным методом для создания пули. – max

+0

Спасибо @max, я подозревал, что именно поэтому я задал еще один вопрос, связанный с созданием настраиваемого метода для создания пули: http://stackoverflow.com/questions/41658221/rails-routing-using-custom-attribute-rather- чем-таблицы-колонки – joshweir

ответ

2

Вы не можете сделать это напрямую, используя дружественный идентификатор из-за того, как он использует slug для запроса базы данных (relevant source).

Однако не сложно выполнить то, что вы хотите. Что вам нужно будет два метода:

  1. Model#slug метод, который даст вам тихоход для конкретной модели
  2. Model.find_by_slug метод, который будет генерировать соответствующий запрос для конкретного слизня.

Теперь в ваших контроллерах вы можете использовать Model.find_by_slug, чтобы получить соответствующую модель из параметров пути. Однако осуществление этого метода может быть сложно, особенно если ваш Model#slug использует необратимый реализацию пробок, как Slugify, потому что он просто получить освобождается от непризнанных символов в тексте и нормализует несколько вещей, чтобы тот же характер (например, _ и -. В -)

Вы можете использовать URI::Escape.encode и URI::Escape.decode, но в итоге вы получите несколько уродливых слизней.

0

Как обсуждалось 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-адрес по умолчанию.

Смежные вопросы