是否可以验证新帖子的标题是否不等于现有的永久链接?

时间:2010-06-28 15:57:46

标签: ruby-on-rails

在这个简化的场景中,我有一个名为Post

的模型
  • 每个帖子都有标题和永久链接

  • 永久链接用于网址 - 即http://mysite.com/blog/permalink

  • 在创建帖子之前,回调设置固定链接与标题相同

我验证了每个标题的唯一性,但我没有明确验证永久链接的唯一性有三个原因:

  1. 永久链接等于标题,该标题已经过唯一性验证
  2. 用户没有永久链接的概念,因为他们永远不会被要求输入,因此当他们收到错误告诉他们固定链接需要是唯一的时,他们就不知道这意味着什么
  3. 我正在使用mongoid作为ORM,永久链接是每个帖子的关键,mongoid似乎不允许你修改一个键
  4. 现在想象以下场景:

    • 用户创建一个标题为“hello”的帖子,网址为http://mysite.com/blog/hello

    • 用户将标题更改为“goodbye”,但永久链接保持不变,因为它是不可变的设计。这很好,这就是我想要的,并有助于防止链接腐烂。

    • 然后,用户创建了一个名为“hello”的新帖子,因为我们已经更改了第一篇文章的标题,因此验证不会失败

    这里的问题是,由于我们的before_create回调,我们现在有两个相同网址的帖子。

    正如我所说,我不想验证永久链接的唯一性,因为上面的扫描中的用户,在创建第二个帖子时会收到“永久链接必须是唯一的”错误,我只是知道这会让他们感到困惑

    所以我在想,有没有验证或技术可以阻止用户创建一个标题等于现有永久链接的帖子?

    如果所有其他方法都失败了,那么我将只验证固定链接的唯一性,并写出一条非常冗长的验证错误消息,详细说明永久链接是什么,以及为什么这个不被认为是唯一的

    制作网站时我们必须考虑的事情,什么是随身携带

3 个答案:

答案 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)

我可以想到四种可能的解决方案:

  1. 验证固定链接的唯一性如下:

    validates_uniqueness_of :permalink, :message => "This title is already taken"
    

    这将向用户显示可理解的消息。

  2. 更改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
    
  3. 将您的before_create更改为before_save回调,但只要您的标题不会更改,结果链接就会永久保留。

  4. 使用friendly_id创建和管理永久链接。它非常强大。