在路由中使用字母数字 slug 而不是 id - Rails

Using alpha-numeric slugs instead of ids in routes - Rails

我正在构建一个 Rails 5 team management 应用程序,它允许用户管理组织和用户。我希望能够从在路径中使用 :id(例如:/organizations/43)而改为使用字母数字段(例如:/organizations/H6Y47Nr7)。类似于 Trello 执行此操作的方式(即:https://trello.com/b/M9X71pE6/board-name)。有没有简单的方法可以做到这一点?

我已经看到 FriendlyId gem 可以处理路径中的弹头,但是首先生成弹头的最佳方法是什么?

理想情况下,对于大多数 bang for buck,slug 将包括 A-Z、a-z 和 0-9(据我了解,这是 Base58?)并且为了不要把 url 吹得太多,最多 8 个字符。如果我的计算是正确的,这给出了 218 万亿个组合,这应该足够了。

我走在正确的轨道上吗?任何帮助将不胜感激。

谢谢

要创建 slug,最简单的方法是使用 SecureRandom。您可以在模型中添加如下内容

before_create :generate_slug

private

def generate_slug
  begin
    self.slug = SecureRandom.urlsafe_base64(8)
  end while Organization.exists?(slug: slug)
end

关于您想要的内容,这里有一个小警告,即 slug 有时会包含下划线或破折号,但这应该没问题。

irb(main):014:0> SecureRandom.urlsafe_base64(8)
=> "HlHHV_6rN3k"
irb(main):015:0> SecureRandom.urlsafe_base64(8)
=> "naRqT-NmYDU"
irb(main):016:0> SecureRandom.urlsafe_base64(8)
=> "9h04l4jEEsM"

如果你走那条路,我会创建一个 table 如果你保存你正在生成的 slug,即使你删除了一个组织也不要删除它们。当您创建一个新的组织时,查询这个模型以确保没有重复的 slug。还要在组织 table 的 slug 列中添加一个唯一索引。

你不应该放弃带有整数的 id 列,所以在 show 方法中你需要做:

org = Organization.where(slug: params[:id]).first