2017-02-27 82 views
0

我正在构建一个让用户管理组织和用户的Rails 5团队管理应用程序。我希望能够在路径中使用:id(例如:/organizations/43),并使用字母数字代替(例如:/organizations/H6Y47Nr7)。类似于Trello如何做到这一点(即:https://trello.com/b/M9X71pE6/board-name)。有没有一个简单的方法来做到这一点?在路线中使用字母数字slu instead代替ids - Rails

我已经看到了FriendlyId宝石,它可以处理路径中的猛击,但是首先产生slu what的最好方法是什么?

理想情况下,对于最多爆炸降压 slu would将包括AZ,az和0-9(据我所知,这是Base58?),并且为了不会将URL过度吹出,8最多的字符。如果我的计算结果是正确的,那么这将产生218万亿个组合,这应该足够多。

我在正确的轨道上吗?任何帮助将非常感激。

感谢

+0

您可以检查[hashids(https://github.com/peterhellberg/hashids。 rb)支持自定义数量的字符和字符以包含在slu ge中的宝石。我最近做了一个rails [插件](https://github.com/sajan45/hashids_activerecord),但我还没有在生产中使用过它们。 – Sajan

+1

看看我的老答案在这里http://stackoverflow.com/a/16096646/1297435 –

回答

1

要创建蛞蝓,最简单的方法是使用SecureRandom。您可以

before_create :generate_slug 

private 

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

一个小小的警告这里对于添加像下面在你的模型,你想要的东西是,塞有时会包含下划线或破折号但应该罚款。

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" 
+0

感谢您的回复。难道我不能仅仅使用'SecureRandom.base58(8)'而不是?它返回类似'KBz4i9ux'的东西。 – slehmann36

+0

另外,处理碰撞怎么样?或者'SecureRandom'照顾它?再次感谢! – slehmann36

+0

不熟悉'base58'。我之所以使用'urlsafe_base64'是因为你需要一个url安全的字符串。至于碰撞,发生比赛情况的可能性很小,但我不担心 – jvnill

0

如果你走这条路,我会创建一个表中保存您生成蛞蝓,当你删除一个组织不要删除它们连。当你创建一个新组织查询这个模型时,确保没有重复的slu gs。还要在组织表的slug列中添加一个唯一的索引。

你不应该放弃与整数id列,以便在展会方法,你需要做的:

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