Ruby on Rails: лучший способ справиться с повторной проверкой ошибок без перехода? - PullRequest
2 голосов
/ 28 мая 2011

В языках, в которых есть 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 ]

5 голосов
/ 28 мая 2011

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).

1 голос
/ 28 мая 2011

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

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

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

if load_model1 && load_model2 && load_model3
  ... do regular page view
else
  #render error page, use  @load_error
end

private
  def load_model1
     @model1 = ....
     if @model1.blank?  # or nil? or whatever error condition
        @load_error="model 1 failed
        return false
     else
        return true
     end
  end

  def load_model2
    ...
  end

  def load_model3
     ...
  end

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