【问题标题】:Is it possible to validate that the title of a new post is not equal to an existing permalink?是否可以验证新帖子的标题不等于现有的永久链接?
【发布时间】:2010-06-28 15:57:45
【问题描述】:

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

  • 每个帖子都有一个标题和一个固定链接

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

  • 在创建帖子之前,回调将永久链接设置为与标题相同

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

  1. 永久链接等于标题,该标题已经过唯一性验证
  2. 用户对永久链接一无所知,因为他们从来没有被要求输入一个,所以当他们收到一个错误告诉他们永久链接必须是唯一的时,他们不知道这意味着什么
  3. 我在 ORM 中使用 mongoid,永久链接是每个帖子的关键,mongoid 似乎不允许你修改关键

现在想象以下场景:

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

  • 用户将标题更改为“再见”,但永久链接保持不变,因为它在设计上是不可变的。这很好,这是我想要的,有助于防止链接失效。

  • 然后用户创建了一个名为“hello”的新帖子,它不会通过验证,因为我们已经更改了第一个帖子的标题

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

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

所以我在想,是否有一种验证或一种技术可以让我阻止用户创建标题与现有永久链接相同的帖子?

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

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

【问题讨论】:

    标签: ruby-on-rails


    【解决方案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 创建和管理永久链接。非常强大。

    【讨论】:

    • 改变了我接受的答案,我喜欢你所有的建议,我会选择 4 号,因为它很简单
    【解决方案2】:

    您创建永久链接名称的方法可以检查该永久链接是否唯一,如果不是,则将 YYYYMMDDHHMMSS 值(或用于创建唯一永久链接的其他值)附加到永久链接。

    【讨论】:

      【解决方案3】:

      您可以编写自定义验证方法

      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
      

      【讨论】:

        猜你喜欢
        • 2012-05-13
        • 1970-01-01
        • 1970-01-01
        • 2015-03-07
        • 2017-02-20
        • 2012-09-11
        • 1970-01-01
        • 2011-03-28
        • 1970-01-01
        相关资源
        最近更新 更多