Пользовательский метод после некоторой проверки - PullRequest
0 голосов
/ 24 августа 2011

Хорошо.

1) Мне нужно проверить :link в моей модели и сделать это, только если она не пуста (или равна нулю).

2) Если :link не является пустым и стандартная проверка прошла успешно - мне нужно запустить свой собственный метод проверки, чтобы проверить доступность URL.

Под «стандартной» проверкой я имею в виду что-то вроде этого:

validates :link, :presence => true, :uniqueness => true, 
                 :format => { :with => /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix }

Как правильно это реализовать?

Ответы [ 3 ]

0 голосов
/ 24 августа 2011
validates_format_of :url_field, :with => URI::regexp(%w(http https))
0 голосов
/ 25 августа 2011

Хорошо. С помощью друзей я наконец-то решил это.

class Post < ActiveRecord::Base

  # skipped some things not necessary 

  validates_format_of :link, :with => /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix , :allow_blank => true
  validates_length_of :link, :maximum => 2000
  validates_uniqueness_of :link, :allow_blank => true

  validate :ensure_link_is_available, :if => proc{|post| post.link.present? && post.errors.empty?}

  def ensure_link_is_available
    begin
      require "net/http"
      url = URI.parse(self.link)
      req = Net::HTTP.new(url.host, url.port)
      res = req.request_head(url.path)
    rescue
      # error occured, add error
      self.errors.add(:link, 'The requested URL could not be retrieved')
    else
      # valid site
      if (res.code.to_i > 308) 
        error_message = 'Server responded with ' + res.code
        self.errors.add(:link, error_message)
      end
    end
  end                    

end
0 голосов
/ 24 августа 2011

Проверяет проверку в вашей модели, только если ссылка не пуста:

validates_presence_of :link, :uniqueness => true, 
                      :format => { :with => /^(http|https)://[a-z0-9]+([-.]{1}[a-z0-9]+).[a-z]{2,5}(:[0-9]{1,5})?(/.)?$/ix }, :if => :link_present?

def link
  self.link
end

def link_present?
  link.present?
end
...