Можно ли проверить, что заголовок нового сообщения не равен существующей постоянной ссылке? - PullRequest
0 голосов
/ 28 июня 2010

В этом упрощенном сценарии у меня есть модель под названием Post

  • Каждый пост имеет заголовок и постоянную ссылку

  • Постоянная ссылка используетсяв URL - то есть http://mysite.com/blog/permalink

  • Перед созданием сообщения обратный вызов устанавливает постоянную ссылку, совпадающую с названием

Я проверяюуникальность каждого заголовка, но я не проверяю уникальность постоянной ссылки по трем причинам:

  1. постоянная ссылка равна заголовку, который уже был проверен для уникальности
  2. пользователейне имеют понятия о постоянной ссылке, так как их никогда не просят ввести, поэтому, когда они получают сообщение о том, что постоянная ссылка должна быть уникальной, они не имеют ни малейшего представления о том, что это означает
  3. i 'Используя mongoid для ORM, постоянная ссылка является ключом для каждого сообщения, и mongoid, похоже, не позволяет вам модифицировать ключ

Теперь представьте себе следующий сценарий:

  • Пользователь создает сообщениезаголовок "привет", а URL-адрес - http://mysite.com/blog/hello

  • Пользователь меняет заголовок на "до свидания", но постоянная ссылка остается прежней, поскольку она неизменна по своему замыслу.Это хорошо, это то, что я хочу, и помогает предотвратить ссылочную гниль.

  • Затем пользователь создает новое сообщение под названием "привет", которое не проходит проверки, так как мы изменилизаголовок первого сообщения уже

Проблема здесь в том, что теперь у нас есть два сообщения с одинаковым URL благодаря нашему обратному вызову before_create.

Как я уже сказал,Я не хочу проверять уникальность постоянной ссылки, так как пользователь в вышеупомянутом scanrio, при создании вторых сообщений получит ошибку «постоянная ссылка должна быть уникальной», и я просто знаю, что это их запутает

Я думал, есть ли валидация или метод, который позволяет мне запретить пользователю создавать пост, заголовок которого равен существующей постоянной ссылке?

Если все остальное не сработает, тогда я простопроверить уникальность постоянной ссылки и выписать действительно длинное сообщение об ошибке проверки, в котором подробно описывается, что такое постоянная ссылка и почему она не считается уникальной

Что нужно учитывать при создании веб-сайтов, что делать

Ответы [ 3 ]

1 голос
/ 28 июня 2010

Вы можете написать собственный метод проверки

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
1 голос
/ 28 июня 2010

Я могу придумать четыре возможных решения:

  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 для создания и управления постоянной ссылкой. Это очень мощный.

1 голос
/ 28 июня 2010

Ваш метод, который создает имя постоянной ссылки, может проверить, является ли эта постоянная ссылка уникальной, а если нет, то добавить значение YYYYMMDDHHMMSS (или другое значение для создания уникальной постоянной ссылки) к постоянной ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...