Хорошая практика спасения в шаблоне erb?
Вопрос прост:
Это хорошая практика использования спасения, как это?
...
<td><%= @customer.address.city.name rescue "-" %></td>
<td><%= @customer.address.province.name rescue "-" %></td>
<td><%= @customer.address.country.name rescue "-" %></td>
...
Если нет, то где это решение? "если" раньше?
4 ответа
Использование try
Метод в Rails:
<td><%= @customer.address.city.try(:name) || '-' %></td>
В Ruby 2.3+ вы можете использовать собственный безопасный оператор навигации:
<td><%= @customer&.address&.city&.name || '-' %></td>
Я думаю, что это плохая практика, потому что rescue
за исключениями и если где-то случаются ошибки, вы этого не знаете.
Используйте условный или троичный оператор или что-то еще, но не используйте спасение для этого случая:
<td><%= @customer.address.city.name if @customer.address %></td>
<td><%= @customer.address ? @customer.address.city.name : '-' %></td>
Если вы хотите, чтобы Rails таким образом переместил эту логику ApplicationHelper
или используйте драгоценный камень Drapper.
Нет, не рекомендуется использовать функцию спасения на страницах просмотра.
Попробуйте следующий троичный оператор ruby вместе с методом try:
...
<% = @ customer.try (: address).present?? @ customer.try (: address).try (: city).try (: name): "-"%>
...
Вы также можете связать метод try в условной части.
Тернарный оператор аналогичен условию if else, но нам не нужно переходить к многострочному кодированию с if-else.
Надеюсь, поможет..
НАРКОЗ - это тоже хорошая практика.
Спасибо!!
Эта проблема:
...
<td><%= @customer.address.city.name rescue "-" %></td>
<td><%= @customer.address.province.name rescue "-" %></td>
<td><%= @customer.address.country.name rescue "-" %></td>
...
Решение:
...
<td><%= (@customer.address && @customer.address.city && @customer.address.city.name) || "-" %></td>
<td><%= (@customer.address && @customer.address.province && @customer.address.province.name) || "-" %></td>
<td><%= (@customer.address && @customer.address.country && @customer.address.country.name) || "-" %></td>
...