Каков наилучший способ проверки нескольких электронных писем и обработки ошибок в Rails? - PullRequest
3 голосов
/ 24 марта 2009

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

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

blah@example.com, test @ example, foo@example.com

... тогда blah@example.com будет сохранен, но сохранение test @ example завершится неудачей. Поэтому мне нужно удалить blah@example.com из строки значений, разделенных запятыми, которые я возвращаю текстовой области, когда показываю ошибку, что test @ example не является действительным адресом электронной почты.

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

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

Ответы [ 4 ]

3 голосов
/ 24 марта 2009

Предполагая, что это модель, у которой есть электронные письма 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

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

0 голосов
/ 24 марта 2009

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

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

0 голосов
/ 24 марта 2009

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

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

0 голосов
/ 24 марта 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-аутентификации.

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