Во-первых, я бы просто назначил символ каждому сообщению об ошибке в виде простого хэша:
ErrorsDescription = {
:first => "First error",
:second => "Second error",
...
}
И использовать символы вместо строк.
Тогда ваши операторы if и switch. По сути, я не могу вам помочь, потому что я не вижу, какие у вас условия. Что вы проверяете? Почему у вас 3 уровня глубины? Вероятно, вы можете написать это проще, используя if и switch - так что это мой первый ответ на этот вопрос. Другим решением может быть написание простых методов для улучшения читабельности, поэтому вы можете написать так:
if @email.has_wrong_reply_to_address?
@errors << :wrong_reply_to_address
else
...
end
Также, как предложил @mpapis, вы можете использовать Rails build в системе валидации, но не как ActiveRecord
, а как ActiveModel
. Здесь у вас есть несколько примеров, как это сделать и как это работает (также посмотрите здесь ). Конечно, вам может понадобиться написать пользовательские проверки, но это всего лишь простые методы. Выполнив все вышеперечисленные задания, вы можете просто использовать:
@email.valid?
А если это не так, у вас есть все ошибки в хэше:
@email.errors
Как и в обычном ActiveRecord
объекте.
Затем вы можете расширить класс Emial
с помощью метода send_error_email
, который отправляет электронное письмо, если произошла ошибка.
EDIT:
Это новая информация, которую вы добавили в комментарии.
Вам не нужно использовать вложенные ifs и переключаться здесь. Вы можете сделать это так:
def is_this_email_valid?
if !email_from_user_in_system?
@errors << :user_not_in_system
return false
end
if comment_not_exists?
@errors << :comment_not_exists
return false
end
if user_cannot_comment_here?
@errors << :permision_error
return false
end
...
true
end
Тогда вы можете использовать его:
if !@email.is_this_email_valid?
@email.send_error_mail
end