Каков наилучший способ разложить этот код в рельсах? - PullRequest
0 голосов
/ 05 сентября 2018

Я хотел бы разложить этот код (если / еще).

Во-первых, я делаю что-то вроде этого:

  <% @pois.each_with_index do |poi, i| %>
        <div class="card-item">
          <% if poi.poitable.sleep_images.blank? %>
            <div class="card-sleep-thumb" style="background-image: url(<%= cl_image_path("comingsoon.jpg", :width=>600, :crop=>"scale") %>);">
          <% else %>
            <div class="card-sleep-thumb" style="background-image: url(<%= cl_image_path(poi.poitable.sleep_images.first.image, :width=>600, :crop=>"scale") %>);">
          <% end %>

Вторым способом я пытаюсь по-другому думать так:

<div class="card-sleep-thumb" style="background-image: url(<%= if poi.poitable.sleep_images.blank? ? cl_image_path("comingsoon.jpg", :width=>600, :crop=>"scale" : cl_image_path(poi.poitable.sleep_images.first.image, :width=>600, :crop=>"scale") %>);" %>

Но, может быть, есть лучший способ с методом в моей модели?

Как вы можете сделать то же самое?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Вы можете использовать оператор ||, который возвращает первый «истинный» операнд, вместо 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>
0 голосов
/ 05 сентября 2018

Метод User Helper

class SomeModelHelper
  def some_method_name(poi)
    if poi.poitable.sleep_images.blank?
      cl_image_path("comingsoon.jpg", :width=>600, :crop=>"scale")
    else
      cl_image_path(poi.poitable.sleep_images.first.image, :width=>600, :crop=>"scale")
    end
  end
end


// in the view

<div class="card-sleep-thumb" style="background-image: url(<%= some_method_name(poi).html_safe %>);" %>

Конечно, вы должны использовать помощник, связанный с классом poi (например, PoiHelper, если класс называется Poi), и иметь более выразительное имя для метода помощника.

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