【问题标题】:Change the unique generated title names of friendly-id更改friendly-id的唯一生成标题名称
【发布时间】:2014-10-12 08:07:56
【问题描述】:

我正在使用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分配另一个标题。

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

【问题讨论】:

    标签: ruby-on-rails friendly-id


    【解决方案1】:

    UUID

    您提到的问题是 friendly-id appends a hash(他们称之为 UUID)复制条目的方式:

    现在已添加候选人,FriendlyId 不再使用 数字序列来区分冲突的 slug,而是一个 UUID (例如 2bc08962-b3dd-4f29-b2e6-2​​44710c86106 之类的东西)。这使得 并发运行时,代码库更简单,更可靠,在 发生冲突时生成更丑的 id 的代价。

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

    --

    你会想read this documentation (very informative)

    它说有两种方法可以确定分配给您的记录的“slug”,一种是使用自定义方法,另一种是覆盖normalize_friendly_id 方法。以下是我对您的解释:

    自定义方法

    #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
    

    【讨论】:

    • 使用 UUID 可防止在合并数据库时发生冲突(当 Web 应用程序大到足以跨多个服务器+数据库分布时,可能会经常发生冲突)。虽然这只是我个人的假设,但我相信这是friendly_id团队改变slug冲突行为以使用UUID的原因
    • 请注意您提供的规范化方法不再有效,并且我收到错误“参数数量错误(给定 1,预期为 0)”。我知道这是不久前的事情,但任何帮助都将不胜感激,因为这种方法对我来说似乎是合理的,可以覆盖 uuid 的默认附加。另请注意,我在friendly_id 字段(:name)上使用范围::account_id,以防这会影响代码使其正常工作
    • 请注意,我为此创建了一个单独的问题线程:stackoverflow.com/questions/49844078/…
    【解决方案2】:

    查看documentation 获取最新版本的friendly_id:

    一种新的“候选”功能,可以轻松设置可用于唯一区分记录的替代 slug 列表,而不是附加序列。

    直接来自文档的示例:

    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
    

    【讨论】:

    • 我认为这是正确的,尽管原因与问题不同!
    • 太棒了!感谢分享!它也可以用作解决方案!
    • @RichPeck 不确定您的意思?问题是如何为重复项生成更友好的 slug。这回答了它,一般来说,不是吗?
    • 是的,但它会在蛞蝓后面附加其他名称——我认为他正在寻找一种更“强大”的处理方式
    • 我为你写了一个答案——无意贬损,我只是想知道如何自己做!
    猜你喜欢
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多