使用字母数字slugs而不是路由中的id - Rails

时间:2017-02-27 05:51:29

标签: ruby-on-rails activerecord slug alphanumeric

我正在构建一个Rails 5团队管理应用程序,它允许用户管理组织和用户。我希望能够在路径中使用:id更改(例如:/organizations/43)并使用字母数字slug(例如:/organizations/H6Y47Nr7)。类似于Trello这样做(即:https://trello.com/b/M9X71pE6/board-name)。这样做有简单的方法吗?

我已经看到了FriendlyId宝石可以处理路径中的阻塞,但是首先产生滑块的最佳方法是什么?

理想情况下,对于大多数 bang for buck ,slug将包括AZ,az和0-9(据我所知,这是Base58?)并且为了不吹出网址太多,最多8个字符。如果我的计算是正确的,那么这会产生218万亿个组合,这应该是充足的。

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

由于

2 个答案:

答案 0 :(得分:1)

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

before_create :generate_slug

private

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

关于你想要的东西,这里有一个小小的警告是slu the有时会包含一个下划线或短划线但是应该没问题。

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"

答案 1 :(得分:0)

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

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

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