Дружественные проверки формы (Rails) - PullRequest
0 голосов
/ 25 января 2009

Я проверил оба из этих ранее заданных вопросов, и это помощь, но не полное решение для моего случая.

По сути, мне нужно проверить отправленный пользователем URL из формы. Я начал с проверки того, что он начинается с http://, https://, или ftp: //:

class Link < ActiveRecord::Base
  validates_format_of [:link1, :link2, :link3, 
        :link4, :link5], :with => /^(http|https|ftp):\/\/.*/
end

Это прекрасно работает для того, что он делает, но мне нужно пройти эти два шага дальше:

  1. Пользователям должно быть разрешено оставлять поля формы пустыми, если необходимо, и
  2. Если URL-адрес, предоставленный пользователем, еще не начинается с http: // (скажем, они вводят google.com, например), он должен пройти проверку, но добавить префикс http: // во время обработки.

Мне трудно определить, как сделать это чисто и эффективно.

Ответы [ 2 ]

3 голосов
/ 25 января 2009

К вашему сведению, вам не нужно передавать массив в validates_format_of. Ruby будет делать массивы автоматически (Rails анализирует вывод *args).

Итак, на ваш вопрос, я бы пошел на что-то вроде этого:

class Link < ActiveRecord::Base
  validate :proper_link_format

  private

  def proper_link_format
    [:link1, :link2, :link3, :link4, :link5].each do |attribute|
      case self[attribute]
      when nil, "", /^(http|https|ftp):\/\//
        # Allow nil/blank. If it starts with http/https/ftp, pass it through also.
        break
      else
        # Append http
        self[attribute] = "http://#{self[attribute]}"
      end
    end
  end
end
1 голос
/ 06 февраля 2009

Чтобы добавить вышесказанное, я использую URI-модуль Ruby для анализа URL-адресов на достоверность.

http://www.ruby -doc.org / STDLIB / libdoc / URI / RDoc / классы / URI.html

Это работает очень хорошо, и это помогает мне избегать регулярных выражений.

...