Подтверждает уникальность: ссылка - PullRequest
1 голос
/ 24 января 2010

У меня есть поле URL с именем link в моей модели со следующей проверкой

validates_uniqueness_of :link, :case_sensitive => false

Когда я ставлю "http://stackoverflow.com",, все идет хорошо. Теперь, когда я ставлю "https://stackoverflow.com/" (с конечным slach), это также считается уникальным. Но я хочу, чтобы он был недействительным, хотя в конце есть символ "/"?

Ответы [ 3 ]

2 голосов
/ 25 января 2010

Я бы посоветовал вам нормализовать ваши URL (добавить / убрать косую черту и т. Д., См. http://en.wikipedia.org/wiki/URL_normalization) перед сохранением их в БД и даже до проверки.

validates_uniqueness_of :link, :case_sensitive => false
before_validation :normalize_urls

def normalize_urls
  self.link.strip!
  self.link.gsub!(/\/$/,'')
end

Это не совсем то, о чем вы просили, но если вы не сохраните нормализованные URL-адреса, вам придется запросить в вашей БД все возможные варианты во время проверки, и это может быстро стать дорогим.

1 голос
/ 24 января 2010

Вы всегда можете сделать собственный валидатор (например, с помощью метода validate).

Это может выглядеть примерно так:

class MyModel < ActiveRecord::Base
  validate :link_is_unique

  def link_is_unique
    #Clean up the current link (removing trailing slashes, etc)
    link_to_validate = self.link.strip.gsub(/\/$/,'')

    # Get the current count of objects having this link
    count = MyModel.count(:conditions => ['link = ?', link_to_validate])

    # Add an error to the model if the count is not zero
    errors.add_to_base("Link must be unique") unless count == 0
  end
end

Затем можно добавить другую логику для очистки ссылки (т. Е. Проверить http://, www и т. Д.)

0 голосов
/ 24 января 2010

Вы можете настроить проверки. Смотри это Railscast .

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