我正在使用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
。
在此question,RSB(用户)告诉我它的friendly_id导致了这一点。我想知道是否有办法创造一个更友好的。起初我想到“手动”检查是否存在相同的标题(在while循环中)并使用example-2或example-3或... example-N分配另一个标题。
但是我需要做那样的事情还是我错过了什么?有没有更简单的方法来做这样的事情?
答案 0 :(得分:5)
检查documentation以获取最新版本的friendly_id:
新的候选人"功能,可以轻松设置可用于唯一区分记录的备用slu List列表,而不是附加序列。
直接来自文档的示例:
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
答案 1 :(得分:3)
<强> UUID 强>
您提到的问题是friendly-id
appends a hash
(他们称之为UUID)重复条目的方式:
现在添加了候选人,FriendlyId不再使用了 数字序列来区分冲突的slug,而不是UUID (例如2bc08962-b3dd-4f29-b2e6-244710c86106)。这使得 在并发运行时,代码库更简单,更可靠 当存在冲突时会产生丑陋的id。
我不明白为什么他们这样做了,因为它违背了友好 ID的口号,但是,你必须意识到它是如何工作的。虽然我不认为上面的slug_candidates
方法会证明更成功,但我做认为你可以使用类似custom method
的方法来定义你想要的slu
-
您需要read this documentation (very informative)
它说有两种方法可以通过使用自定义方法或通过覆盖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