Вы можете использовать оператор ||
, который возвращает первый «истинный» операнд, вместо if
/ else
, который вы в данный момент используете:
cl_image_path(poi.poitable.sleep_images.first&.image || "comingsoon.jpg")
Этот аргумент cl_image_path
будет либо изображением, если оно присутствует, либо "comingsoon.jpg"
в противном случае.
Первый проход рефакторинга, который вы могли бы выглядеть так:
<% @pois.each do |poi| %>
<div class="card-item">
<div class="card-sleep-thumb" style="background-image: url(<%= cl_image_path(poi.poitable.sleep_images.first.image || "coming_soon.jpg"), :width=>600, :crop=>"scale") %>);">
</div>
</div>
<% end %>
Тем не менее, вы можете многое исправить, опустив each
и используя рендеринг коллекции.
Ваш существующий вид будет выглядеть так:
<%= render @pois %>
и вы создадите новый фрагмент, содержащий HTML-представление заданного "Poi". Я не знаю, как называется класс, но если это Poi
, частичное должно быть помещено в app/views/pois/_poi.html.erb
, и оно будет содержать следующее:
<div class="card-item">
<div class="card-sleep-thumb" style="background-image: url(<%= cl_image_path(poi.poitable.sleep_images.first.image || "coming_soon.jpg"), :width=>600, :crop=>"scale") %>);">
</div>
</div>