Каков наилучший способ проверки нескольких электронных писем и обработки ошибок в Rails?

В текущем приложении, которое я создаю, у меня есть текстовое поле, в котором пользователь вводит список адресов электронной почты, разделенных запятыми.

В настоящее время я разбиваю список на массив, а затем сохраняю один за другим. Но если, скажем, у меня есть этот вход...

[email protected], test@example, [email protected]

... тогда [email protected] будет сохранен, но сохранение test@example не удастся. Затем мне нужно удалить [email protected] из строки значений с разделителями-запятыми, которую я передаю обратно в текстовую область, когда я показываю ошибку, что test@example не является допустимым адресом электронной почты.

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

Заранее спасибо!


person kareem    schedule 23.03.2009    source источник


Ответы (4)


Предполагая, что это модель с has_many электронных писем, и модель электронной почты использует :validate_email, вы можете сделать что-то вроде следующего:

class Foo < ActiveRecord::Base
  validate :must_not_have_invalid_addresses

  ...

  def emails=(addresses)
    @invalid_addresses = []
    addresses.split(",").each do |address|
      @invalid_addresses.push(address) unless emails.create({:address => address})
    end
  end

  def must_not_have_invalid_addresses
    errors.add_to_base("Some email addresses were invalid") unless @invalid_addresses.empty?
  end

end

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

person dstnbrkr    schedule 24.03.2009

ruby имеет разделенную функцию (.each), описанную здесь, и поддерживает обычные выражения, как описано здесь

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

person Steven Evers    schedule 23.03.2009

Вы можете поместить сохранение электронных писем в транзакцию. Затем, если какое-либо сохранение не удастся, все предыдущие сохранения будут отменены. В таком случае проверки могут выполняться только на уровне модели.

Я думаю, что это будет четкий код, но наверняка это не самый быстрый способ (но использование Ruby означает, что вы не делаете это даже быстрым способом;))

person klew    schedule 23.03.2009

Если они у вас есть в переменной с именем emails, возможно, что-то вроде этого может работать:

  if valid_emails?(emails)
      # then have your normal logic here
      if @user.save
           flash[:notice] .....

      end
  end

  private
     def valid_emails?(emails)
        not emails.find {|email| email =~ /[\w\.%\+\-]+@(?:[A-Z0-9\-]+\.)+(?:[A-Z]{2,}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|jobs|museum)/i }.nil?
     end

РЕДАКТИРОВАТЬ: на самом деле вы можете просто использовать это регулярное выражение. Он был взят из плагина restful-authentication.

person vrish88    schedule 23.03.2009