Ruby on Rails: лучший способ справиться с повторной проверкой ошибок без перехода?

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

Пример в псевдокоде:

 def example
   if (x) goto error
   do something
   if (y) goto error
   do something
   If (z) goto error
   do something
   return
  label 'error'
   log "error occurred"
   begin
     redirect_to :back
   rescue
     redirect_to root_url
   end
   return;
 end

Как вы можете видеть, в этом случае мой блок ошибок занимает столько же времени, сколько сама функция, и повторение его 3 раза удвоит размер моего кода и не будет слишком СУХИМЫМ. Однако, похоже, что Ruby не поддерживает goto, или, по крайней мере, если это так, насколько я могу судить по просмотру в Google, это какая-то библиотека шуток, которая называется злом.

Таким образом, что люди делают в Ruby для обработки повторной проверки ошибок, когда в каждой ошибке должен быть один и тот же результат?

2 ответа

Решение

Callbacks

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

фильтры

Используйте before_filters и after_filters для проверки ошибок, особенно когда вам нужно выполнить эти проверки для нескольких действий контроллера. Пример:

before_filter :check_errors

def example
   regular code...
end

private
  def check_errors
    error checking...
  end

Заявления случая

Используйте Примеры использования для улучшения вашего if заявления, особенно если у вас есть несколько проверок.

Приоритет выше

Используйте обратные вызовы в своих моделях всякий раз, когда это возможно, и определенно, когда требуется сохранение / обновление / проверка данных.

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

Если вам нужно, чтобы эти проверки выполнялись только один раз, в одном только этом действии контроллера, которое не связано с изменением записей, просто перепишите ваш код в допустимом выражении case (но я по-прежнему рекомендую перенести его в before_filter).

Вот маленький секрет: Исключения в основном прославляются. Кроме того, ruby ​​имеет синтаксис catch/throw, см. http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_exceptions.html

В вашем случае спросите, действительно ли это ошибка или просто нежелательное условие. Для меня ошибка в том, что когда метод own_to ссылается на запись, которая не существует, но наличие пустого файла assign_to не существует. Это меняется от ситуации к ситуации.

Глядя на ваш комментарий выше, я думаю, что я был бы более склонен добавить некоторые частные методы, которые устанавливают переменные экземпляра и возвращают true для false, и связывают их вместе:

если load_model1 && load_model2 && load_model3
  ... сделать обычный просмотр страницы
еще
  #render страница ошибки, используйте @load_error
конец

частный
  def load_model1
     @model1 = ....
     если @model1.blank?  # или ноль? или какое-либо условие ошибки
        @load_error="модель 1 не выполнена
        вернуть ложь
     еще
        вернуть истину
     конец
  конец

  def load_model2
    ...
  конец

  def load_model3
     ...
  конец
Другие вопросы по тегам