Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在routes-Rails中使用字母数字段塞代替ID_Ruby On Rails_Activerecord_Slug_Alphanumeric - Fatal编程技术网

Ruby on rails 在routes-Rails中使用字母数字段塞代替ID

Ruby on rails 在routes-Rails中使用字母数字段塞代替ID,ruby-on-rails,activerecord,slug,alphanumeric,Ruby On Rails,Activerecord,Slug,Alphanumeric,我正在构建一个Rails 5团队管理应用程序,它允许用户管理组织和用户。我希望能够改变在路径中使用:id的方式(例如:/organizations/43),而改用字母数字段塞(例如:/organizations/H6Y47Nr7)。与Trello的做法类似(即:https://trello.com/b/M9X71pE6/board-name)。有没有一个简单的方法可以做到这一点 我已经看到了宝石,它可以处理路径中的弹跳,但首先,什么是产生弹跳的最佳方法 理想情况下,为了最大限度地节省成本,slu

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

我已经看到了宝石,它可以处理路径中的弹跳,但首先,什么是产生弹跳的最佳方法

理想情况下,为了最大限度地节省成本,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"

如果你这样做,我会创建一个表,如果你保存你正在生成的slug,即使你删除一个组织,也不删除它们。创建新组织时,请查询此模型以确保没有重复的段塞。还可以在organizations表的slug列中添加唯一索引

您不应放弃带有整数的id列,因此在show方法中,您需要执行以下操作:

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

您可以检查支持自定义字符数和要包含在slug中的字符数的gem。我最近为此制作了一个rails,但我还没有在生产中使用它们中的任何一个。我能不能不使用
SecureRandom.base58(8)
?它返回类似于
KBz4i9ux
的内容。另外,如何处理冲突?或者
SecureRandom
会处理它吗?再次感谢!不熟悉
base58
。我之所以使用
urlsafe\u base64
,是因为您需要一个url安全字符串。至于碰撞,比赛条件发生的可能性很小,但我不担心。谢谢据我所知,base58与base64类似,只是它省略了标点符号和不明确的字符(即:0和O,以及I和l),因此仍然是URL安全的。