Почему гем Friendly_ID использует слаг вместо первичного ключа?

Я получаю сообщение об ошибке от rails после установки Friendly_ID, потому что код неправильно интерпретирует ввод, и я не знаю, как решить эту проблему. Чтобы платформа MVC могла понять URL-адрес и соответствующим образом направить его, URL-адрес должен соответствовать следующему шаблону:

localhost:3000/posts/[:id]

Выше [id] представляет собой первичный ключ для любого объекта, найденного в классе модели Post. Неправильное толкование вступает в силу, когда Friendly_ID изменяет URL-адрес, чтобы он соответствовал следующему шаблону:

localhost:3000/posts/[:slug]

Обновленный URL-адрес, очевидно, легче читается пользователем, но, поскольку мое приложение ожидает получить [:id], оно вызывает следующее исключение для URL-адреса «localhost: 3000/posts/testing»:

Скриншот исключения Rails


Я предполагал, что гем Friendly_ID либо позаботится о внутренней маршрутизации, либо выполнит какой-то [:id] поиск, либо проявит магию через какую-то маскировку URL. Поскольку в данном случае ничего из вышеперечисленного не соответствует действительности, как решить проблему, позволив красивым URL-адресам предоставлять тот же результат, что и исходный шаблон URL-адреса?


person elersong    schedule 25.09.2014    source источник


Ответы (2)


Переопределение Finder отключено, начиная с версии gem 5.0.

Используйте Post.friendly.find(params[:id]) или понижение версии, или используйте надстройку для поиска, см. страницу проекта на github

person urmurmur    schedule 25.09.2014
comment
это прекрасно работает! Но есть ли интуитивно понятный способ заставить рельсы принимать любой шаблон URL? - person elersong; 25.09.2014
comment
@elersong, вы можете сделать это - friendly_id :foo, используйте: [:slugged, :finders] пожалуйста, обратитесь к странице проекта github - person urmurmur; 25.09.2014
comment
На странице github не упоминается, куда должен идти этот код. Куда я должен его положить? - person elersong; 25.09.2014
comment
@elersong, этот код входит в вашу модель Post. разве это уже не там, только без последней части? - person urmurmur; 25.09.2014
comment
Извините, я не ясно выразился. Github не говорит мне, куда поместить friendly_id :foo, use: [:slugged, :finders], если я решу использовать дополнение :finders. - person elersong; 25.09.2014
comment
Поместите его вверху app/models/post.rb. Прямо сейчас у вас должно быть там friendly_id :foo, use: :slugged - person makhan; 25.09.2014

Добавьте config.use :finders к config/initializers/friendly_id.rb

Вот как выглядит мой:

FriendlyId.defaults do |config|
  config.use :reserved

  config.reserved_words = %w(new edit index session login logout users admin
    stylesheets assets javascripts images)

  config.use :finders
end
person makhan    schedule 25.09.2014
comment
Я только что проверил свой каталог инициализаторов, и у меня там нет этого файла. Должно ли это быть? - person elersong; 25.09.2014
comment
Он устанавливает конфигурацию по умолчанию. Если вы используете дружественный идентификатор только для одного класса, он вам не нужен. Но если вы используете его для нескольких классов, лучше хранить конфиг в одном месте. - person makhan; 26.09.2014