Имена 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-адресами.