Имена Mongo приводят к страшным URL-адресам
Это может показаться тривиальным вопросом, но это очень важно для приложений, ориентированных на потребителя.
Каков самый простой способ и наиболее масштабируемый способ сопоставить страшный идентификатор mongo с дружественным идентификатором?
xx.com/posts/4d371056183b5e09b20001f9
К
xx.com/posts/a
M
Ответы
Ответ 1
Определите дружественное уникальное поле (например, slug) в вашей коллекции, индексируйте его, на своей модели, определите to_param
, чтобы вернуть его:
def to_param
slug
end
Затем в ваших искателях найдите по slug, а не по ID:
@post = Post.where(:slug => params[:id].to_s).first
Это позволит вам рассматривать слизни как эффективный ПК для целей взаимодействия с ресурсами, и они намного красивее.
Ответ 2
Вы можете создать составной ключ в mongoid, чтобы заменить идентификатор по умолчанию, используя ключевой макрос:
class Person
include Mongoid::Document
field :first_name
field :last_name
key :first_name, :last_name
end
person = Person.new(:first_name => "Syd", :last_name => "Vicious")
person.id # returns "syd-vicious"
Если вам не нравится этот способ сделать это, проверьте этот драгоценный камень: https://github.com/hakanensari/mongoid-slug
Ответ 3
К сожалению, ключевой макрос был удален из монго. Для пользовательских идентификаторов,
теперь пользователи должны переопределить поле _id.
class Band
include Mongoid::Document
field :_id, type: String, default: ->{ name }
end
Ответ 4
Вот отличный камень, который я использовал для успешного ответа на эту проблему: Mongoid-Slug
https://github.com/digitalplaywright/mongoid-slug.
Он обеспечивает приятный интерфейс для добавления этой функции в несколько моделей. Если вы предпочитаете использовать свои собственные, по крайней мере, проверьте их реализацию для некоторых идей. Если вы идете по этому маршруту, посмотрите на драгоценный камень Stringex, https://github.com/rsl/stringex и в библиотеку act_as_url внутри. Это поможет вам получить приятные штрихи между URL-адресами.