我想分解此代码(如果/其他)。
在第一种方式中,我会执行以下操作:
<% @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") %>);" %>
但是,也许有更好的方法,在我的模型中使用方法?
你怎么能做同样的事情?
答案 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>