使用 Rails 5,如何让 FriendlyId 附加 -"count+1" 来复制 slug 而不是 UUID?

Posted

技术标签:

【中文标题】使用 Rails 5,如何让 FriendlyId 附加 -"count+1" 来复制 slug 而不是 UUID?【英文标题】:Using Rails 5, how can I make FriendlyId append a -"count+1" to duplicate slugs instead of a UUID? 【发布时间】:2018-09-25 09:53:26 【问题描述】:

显然 FriendlyId 已将其以前的默认方法将数字序列附加到重复 slug(这是我想要的)更改为现在使用 UUID:

Previous versions of FriendlyId appended a numeric sequence to make slugs unique, but this was removed to simplify using FriendlyId in concurrent code.

目前我对这个功能不感兴趣,我更希望使用能够产生更清晰 URL 的原始方法。我发现了一个类似的问题,其中someone provided 下面的代码覆盖了friendlyId normalize_friendly_id 方法以获取我所追求的功能,但使用它会导致错误(wrong number of arguments (given 1, expected 0)):

def normalize_friendly_id
  count = self.count "name = #name"
  super + "-" + count if name > 0
end

我试图将其“转换”为友好的“候选人”,但我真的不知道自己在做什么,以下内容不起作用。关于如何调整 name_candidate 方法以产生我想要的结果的任何想法?

class Folder < ApplicationRecord
  extend FriendlyId
  friendly_id :name_candidates, use: [ :slugged, :scoped ], scope: :account_id

  has_ancestry

  belongs_to :account
  has_many :notes, dependent: :destroy

  validates :name, presence: true

  # # https://***.com/a/25380607/523051
  # # overrride friendlyId to append -number to duplicate folders instead of uuid's
  # def normalize_friendly_id
  #   count = self.count "name = #name"
  #   super + "-" + count if name > 0
  # end

  def name_candidates
    append_number = self.count "name = #name" if name > 0
    [
      :name,
      :name, append_number
    ]
  end
end

请注意,我正在使用friendlyId 的:scoped 功能,因此检查现有文件夹名称的范围应正确地限定为:account_id

【问题讨论】:

【参考方案1】:

friendly_id 5 现在有一个 slug_candidates,可让您自定义 slug。

所以要生成一个连续的 slug,你可以这样做:

friendly_id :slug_candidates, use: :slugged

def slug_candidates
  [:name, :name_and_sequence]
end

def name_and_sequence
  slug = normalize_friendly_id(name)
  sequence = Model.where("slug like '#slug--%'").count + 2
  "#slug--#sequence"
end

这将在以下问题中讨论: https://github.com/norman/friendly_id/issues/480

According to the author, sequential slugs are bad for performance.

【讨论】:

【参考方案2】:

我在另一个线程中遇到了this answer,并且由于该模块已被实现为friendlyId,我所要做的就是将use: :slugged 更改为use: sequentially_slugged 以产生我所追求的功能。

class Folder < ApplicationRecord
  extend FriendlyId
  friendly_id :name, use: [ :sequentially_slugged, :scoped ], scope: :account_id
end

【讨论】:

friendly_id :name, use: :sequentially_slugged,谢谢!【参考方案3】:

因为 normalize_friendly_id 需要一个参数: http://www.rubydoc.info/github/norman/friendly_id/FriendlyId%2FSlugged%3Anormalize_friendly_id

调用super时必须将名称作为参数传递

【讨论】:

谢谢。仍然被困在哪里/我传入什么。如果我添加名称作为参数,如 def normalize_friendly_id(name) 那么我会通过错误的参数数量错误并得到“未定义的方法`count' for #<0x00007f97fc812680>

以上是关于使用 Rails 5,如何让 FriendlyId 附加 -"count+1" 来复制 slug 而不是 UUID?的主要内容,如果未能解决你的问题,请参考以下文章

Rails:FriendlyId gem 不工作

FriendlyID 历史记录不适用于 Rails 中更新的模型 url

在模块中使用 FriendlyId

将 FriendlyID slugs 翻译成对应的 ID

在 FriendlyID slug 中隐藏资源名称

如何让我的 Rails 5 日志向我显示与 Rails 4 一样的每个操作的详细信息?