【问题标题】:Rails generate slug before saving based on other fieldRails 在基于其他字段保存之前生成 slug
【发布时间】:2014-06-14 10:12:43
【问题描述】:

我有一个带有nameslug 参数的Site 模型。我希望 Rails 应用程序在每次用户保存 Site 时生成 slug,但希望 slug 是唯一的。我有一个验证来确保唯一性。

我面临的挑战是,当用户创建具有相同名称的第二个站点时,会生成相同的 slug。例如name = "Helloname = "hElLo" 都生成hello

  before_validation :create_slug

  private

  def create_slug
    self.slug =  self.name.parameterize
  end

我尝试添加一个 while 循环来检查是否存在具有相同 slug 的站点,并在每个循环中添加“-1”到 slug 直到它是唯一的。问题是,如果我更新了一个站点,循环会看到存在具有相同 slug 的站点,并增加 slug,但已经存在的站点是同一个站点。

这是我使用的代码:

  def create_slug
    a = self.name.parameterize
    while Site.where(slug:a).count > 0 do
      a = a + "-1"
    end
    self.slug = a
  end

【问题讨论】:

    标签: ruby-on-rails slug


    【解决方案1】:

    我认为你可以分两步解决你的问题。

    首先通过将 before_filter 修改为条件过滤器来避免始终检查 slug

    before_validation :create_slug if: :name_changed?
    

    这样,只有在 name 字段更新时才会执行回调。

    第二次修改 name 验证器,使其准确检查您需要的内容,而不是使用 rails 提供的默认唯一性验证器,或将验证移至 slug 字段。

    【讨论】:

    • 谢谢 - 如果用户将名称从“Hello”更改为“HeLLo”或类似名称,唯一的问题就出现了。名字变了,但蛞蝓不会。我想我将不得不考虑验证 slug 而不是名称。
    • 我认为这样会更明智。
    【解决方案2】:

    这可能不是您正在寻找的答案,但一个好的策略是将日期放在永久链接中,所以它会像

    /post/:year/:month/:day/:slug

    这将有助于避免 url 重复

    【讨论】:

      猜你喜欢
      • 2020-08-09
      • 1970-01-01
      • 2015-08-15
      • 2013-04-23
      • 2019-01-15
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多