在这个简化的场景中,我有一个名为Post
的模型每个帖子都有标题和永久链接
永久链接用于网址 - 即http://mysite.com/blog/permalink
在创建帖子之前,回调设置固定链接与标题相同
我验证了每个标题的唯一性,但我没有明确验证永久链接的唯一性有三个原因:
现在想象以下场景:
用户创建一个标题为“hello”的帖子,网址为http://mysite.com/blog/hello
用户将标题更改为“goodbye”,但永久链接保持不变,因为它是不可变的设计。这很好,这就是我想要的,并有助于防止链接腐烂。
然后,用户创建了一个名为“hello”的新帖子,因为我们已经更改了第一篇文章的标题,因此验证不会失败
这里的问题是,由于我们的before_create回调,我们现在有两个相同网址的帖子。
正如我所说,我不想验证永久链接的唯一性,因为上面的扫描中的用户,在创建第二个帖子时会收到“永久链接必须是唯一的”错误,我只是知道这会让他们感到困惑
所以我在想,有没有验证或技术可以阻止用户创建一个标题等于现有永久链接的帖子?
如果所有其他方法都失败了,那么我将只验证固定链接的唯一性,并写出一条非常冗长的验证错误消息,详细说明永久链接是什么,以及为什么这个不被认为是唯一的
制作网站时我们必须考虑的事情,什么是随身携带
答案 0 :(得分:1)
创建永久链接名称的方法可以检查永久链接是否唯一,如果没有,则将永久链接附加YYYYMMDDHHMMSS值(或其他值以创建唯一的永久链接)。
答案 1 :(得分:1)
您可以编写自定义验证方法
class Post < ActiveRecord::Base
# You'll need to check only when creating a new post, right?
def validate_on_create
# Shows message if there's already a post with that permalink
if Post.first(:conditions => ["permalink = ?", self.title])
errors.add_to_base "Your error message"
end
end
end
答案 2 :(得分:1)
我可以想到四种可能的解决方案:
验证固定链接的唯一性如下:
validates_uniqueness_of :permalink, :message => "This title is already taken"
这将向用户显示可理解的消息。
更改before_create
回调以创建编号永久链接
def what_ever_your_callback_is_named
self.permalink = self.title.permalinkify # or however you create the permalink
while self.find_by_permalink(self.permalink)
# check if it is an already numbered permalink
if self.permalink =~ /^(.*)(-(\d+))?$/
self.permalink = "#{$~[1]}-#{$~[3].to_i++}"
else
self.permalink << "-2"
end
end
end
将您的before_create
更改为before_save
回调,但只要您的标题不会更改,结果链接就会永久保留。
使用friendly_id创建和管理永久链接。它非常强大。