Там нет абсолютно никаких оснований для использования rescue
здесь. Использование механизмов обработки исключений для управления потоком широко рассматривается как злоупотребление исключениями и обычно считается плохой практикой.
Там нет также вероятно никакой причины использовать x.present? && x.each
, так как (если это объединение ActiveRecord) не будет никогда возвращают falsy «не-настоящее» значение. Он всегда будет возвращать массивный объект, представляющий 0 или более элементов, которые можно безопасно вызывать each
. Если это не ассоциация ActiveRecord, вы должны изменить свой код, чтобы следовать этому соглашению, и вернуть пустой массив вместо nil
.
В общем случае (при условии, ActiveSupport::CoreExtensions доступен), вы можете использовать try
.Предполагая passengers
это метод, который может вернуть nil
, ваши .present?
чеки должны быть try
вызовов:
Car.last.passengers.try(:each) { ... }
Это может быть прикован к artibtrary длины; оба они эквивалентны:
a && a.b && a.b.c
a.try(:b).try(:c)
Обратите внимание, что это не будет работать, если ваш метод не возвращает nil
, но вместо того, чтобы вернуть значение "blank".
Если try
не доступен, ваше настоящее решение широко используется практика, за исключением того, что вы should be using &&
instead of and
- Это не эквивалентные операторы в Ruby.
Car.last.passengers && Car.last.passengers.each { ... }
Если вы хотите сохранить символы, вы можете использовать ||
вместо &&
указать значение по умолчанию, прежде чем прибегать к грязному rescue
трюку вы сейчас рассматриваете:
(Car.last.passengers || []).each { ... }
Если это ассоциация ActiveRecord, существует несколько идиоматических решений Rails, лучшим из которых является перенос ваших «puts» (которые я предполагаю на самом деле - это рендеринг серии элементов HTML s) в свою собственную частицу, называемую _passenger.html.erb
. Затем, вы можете сделать всю коллекцию:
= render Car.last.passengers
Если вы хотите Отрисовку пустого множества по-разному, вы должны зависеть от поведения render
«s возвращения false
, когда пустая коллекция визуализируется:
= render Car.last.passengers || render 'no_cars'
Таким образом, ваша разметка для отображения пользователю «Нет пассажиров» хранится в части _no_cars.html.erb
и визуализируется чисто с помощью одной строки.
обработка исключений является GE обычно для непредвиденных ошибок. Это нормальное состояние, или это действительно исключение? Если это нормально, вы хотите проверить «... пассажиры.представляете?» И отображать сообщение (если хотите) в зависимости от этого условия. Если вы пытаетесь сохранить код DRY, подумайте об использовании вспомогательного метода. – lurker
Я бы сказал, что 'Car # passengers' должен возвращать пустой массив, когда в этом автомобиле нет пассажиров. Если это так, то вся проблема не существует. – spickermann