Rails 3 - Как справляться со сложными утверждениями Switch / If - PullRequest
1 голос
/ 12 декабря 2010

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

Код полон операторов Switch (case / when / end) и операторов If.Я хотел бы научиться умнее, чище способ сделать это.Кроме того, есть способ отслеживать ошибку и, в конце концов, иметь одно место, куда он отправляет пользователю сообщение с ошибкой.Возможно ли что-то подобное с рельсами?

@error = []

Case XXX
when xxxx
  if XXXXX
  else
   @error = 'You don't have permission to reply to the xxxxx'
  end
else
  @error = 'Unfamilar XXXX'
end

Тогда в конце что-то вроде ...

If @errors.count > 0
   Send the user an email letting them know what went wrong
else
 do nothing
end

Спасибо за помощь здесь.Если бы вы знали какие-либо другие учебные пособия, которые научили бы меня, как писать логику, как выше, умнее, это было бы здорово.Прямо сейчас у меня есть случай / если заявления идут на 3 уровня глубже, трудно держать это прямо.

Спасибо

Ответы [ 4 ]

3 голосов
/ 12 декабря 2010

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

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
2 голосов
/ 12 декабря 2010

Я предлагаю использовать исключения. Начните с этого урока , затем используйте Google, методом проб и ошибок, чтобы перейти оттуда.

Редактировать: В более сложных случаях исключения могут быть неправильным инструментом. Вы можете вместо этого использовать функции валидатора, например (см. Другие ответы), или вы можете просто вернуться раньше, а не вкладывать ifs, например:

unless sender_valid?
  @error = "Sender invalid"
  return
end
unless subject_valid?
  @error = "Invalid command"
  return
end
# normal no-errors flow continues here...
1 голос
/ 12 декабря 2010

Возможно ли привязать ваше сообщение к модели? тогда вся логика if / switch будет валидацией и автоматически обрабатывается рельсами. Хорошая отправная точка - руководство по проверке активных записей

Также стоит прочитать руководство по отправке действий

1 голос
/ 12 декабря 2010

Вы можете выдать ошибку, если что-то не так. Тогда поймайте это в конце вашего метода.

http://phrogz.net/programmingruby/tut_exceptions.html

Чтобы сделать ваш код более читабельным и не иметь большого количества переключателей и операторов if / then, вы можете создать отдельные методы, которые проверяют определенные аспекты и вызывать их из основного метода проверки ошибок.

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