我的Site
模型包含name
和slug
个参数。我希望rails应用程序在每次用户保存Site
时生成slug,但希望slug
是唯一的。我有一个验证,以确保唯一性。
我遇到的挑战是,当用户创建具有相同名称的第二个站点时,会生成相同的段塞。例如name = "Hello
和name = "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
答案 0 :(得分:1)
我认为你可以分两步解决问题。
首先避免通过将before_filter修改为条件的
来检查slugbefore_validation :create_slug if: :name_changed?
这样,只有在name
字段更新时才会执行回调。
第二次修改name
验证程序,以便它确切地检查您需要的内容,而不是使用rails提供的默认唯一性验证程序,或将验证移至slug
字段。
答案 1 :(得分:0)
这可能不是您正在寻找的答案,但一个好的策略是将日期置于永久链接中,所以它会像
/post/:year/:month/:day/:slug
这有助于避免网址重复