在Rails中分解此代码的最佳方法是什么

时间:2018-09-04 22:15:56

标签: ruby-on-rails

我想分解此代码(如果/其他)。

在第一种方式中,我会执行以下操作:

  <% @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 :(得分:2)

使用助手方法

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),并为该helper方法使用一个更具表达性的名称。 / p>

答案 1 :(得分:0)

您可以使用||运算符,它返回第一个“真实的”操作数,而不是您当前使用的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 %>

,您将制作一个包含给定“ Poi”的HTML表示形式的新部分。我不知道类名称是什么,但是如果它是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>