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

时间:2014-08-19 09:19:24

标签: ruby-on-rails 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

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

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

2 个答案:

答案 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-2​​44710c86106)。这使得   在并发运行时,代码库更简单,更可靠   当存在冲突时会产生丑陋的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