更改friendly-id的唯一生成标题名称

我正在使用friendly_id gem。 在portfolio.rb中我放了这两行:

extend FriendlyId friendly_id :title, use: :slugged 

如你所见,我也在使用slug选项。 当我创建一个标题为“example”的项目时,它可以找到,我可以在mysite.com/projects/example下找到该项目。 现在,如果我创建第二个具有相同标题的标题,我会得到一个标题,如下所示: mysite.com/projects/example-74b6c506-5c61-41a3-8b77-a261e3fab5d3 。 我真的不喜欢这个头衔。 我希望得到一个像example-2这样更友好的标题。

在这个问题上 ,RSB(用户)告诉我它的friendly_id导致了这个问题。 我想知道是否有办法创造一个更友好的。 起初我想到“手动”检查是否存在相同的标题(在while循环中)并使用example-2或example-3或… example-N分配另一个标题。

但是我需要做那样的事情还是我错过了什么? 有没有更简单的方法来做这样的事情?

查看文档以获取最新版本的friendly_id:

一种新的“候选”function,可以轻松设置可用于唯一区分记录的备用段列表,而不是附加序列。

直接来自文档的示例:

 class Restaurant < ActiveRecord::Base extend FriendlyId friendly_id :slug_candidates, use: :slugged # Try building a slug based on the following fields in # increasing order of specificity. def slug_candidates [ :name, [:name, :city], [:name, :street, :city], [:name, :street_number, :street, :city] ] end end 

UUID

你提到的问题是friendly-id附加一个hash (它们称之为UUID)来复制条目的方式:

既然添加了候选项,FriendlyId不再使用数字序列来区分冲突的段塞,而是使用UUID(例如2bc08962-b3dd-4f29-b2e6-2​​44710c86106)。 这使得代码库在并发运行时更简单,更可靠,代价是在出现冲突时生成丑陋的id。

我不明白为什么他们这样做,因为它违背了友好 ID的口号,但是,你必须意识到它是如何工作的。 虽然我不认为上面的slug_candidates方法会certificate更成功,但我认为你可以使用类似custom method东西来定义你想要的slug

您需要阅读本文档(内容非常丰富)

它说有两种方法可以通过使用自定义方法或通过覆盖normalize_friendly_id方法来确定分配记录的“slug”。 以下是我对这两个方面的解释:

自定义方法

 #app/models/project.rb Class Project < ActiveRecord::Base extend FriendlyID friendly_id :custom_name, use: :slugged def custom_name name = self.count "name = #{name}" count = (name > 0) ? "-" + name : nil "#{name}#{count}" end end 

Normalize_Friendly_ID

 #app/models/project.rb Class Project < ActiveRecord::Base extend FriendlyID friendly_id :name, use: :slugged def normalize_friendly_id count = self.count "name = #{name}" super + "-" + count if name > 0 end end