在基于其他字段保存之前,Rails会生成slug

时间:2014-04-28 18:14:49

标签: ruby-on-rails slug

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

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

  before_validation :create_slug

  private

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

我尝试添加一个while循环,检查是否存在具有相同slug的站点,并在每个循环中向slug添加“-1”,直到它是唯一的。问题是如果我更新了一个站点,循环会看到一个具有相同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

2 个答案:

答案 0 :(得分:1)

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

首先避免通过将before_filter修改为条件的

来检查slug
before_validation :create_slug if: :name_changed?

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

第二次修改name验证程序,以便它确切地检查您需要的内容,而不是使用rails提供的默认唯一性验证程序,或将验证移至slug字段。

答案 1 :(得分:0)

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

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

这有助于避免网址重复