なるべくDRYに
モデルでスコープを使うなどして、なるべくコントローラーをDRYにしてきたので、view側もその流れを汲んでいきたいと思い、調べました。重複した書き方が減るのでかなり綺麗に書けました。
画像ファイルがあるかないかで、表示する画像を分けたい。
自分が投稿した本の画像を表示する機能を作っていましたが、もし画像を投稿をしなかった場合、noimageという画像を表示したく、if文をviewに書いていました。
一枚だけならいいんですが、要件的に同じ機能を一つのページに4つ作る必要がありました。
初期コード
<% if @content_first.blank? %>
<%= image_tag 'no_image.png' %>
<% else %>
<%= image_tag @content_first.to_s %>
<% end %>
<% if @content_second.blank? %>
<%= image_tag 'no_image.png' %>
<% else %>
<%= image_tag @content_second.to_s %>
<% end %>
<% if @content_third.blank? %>
<%= image_tag 'no_image.png' %>
<% else %>
<%= image_tag @content_third.to_s %>
<% end %>
<% if @content_fourth.blank? %>
<%= image_tag 'no_image.png' %>
<% else %>
<%= image_tag @content_fourth.to_s %>
<% end %>
同じような文章が羅列し、かなり汚い。。。。
helperを使うと。。。。
helperのルートはapp/helper内にファイルとしてあります。
xxxxxx_helper.rbはxxxxxのリソース内で利用可能なhelper
application_helper.rbはそのrailsプロジェクト内どこでも利用可能なものです。
今回は本の画像のところでのみ利用したいので、books_helper.rbで利用します。
module BooksHelper
def has_content?(content)
if content.blank?
image_tag 'no_image.png'
else
image_tag content
end
end
end
このようなコードになります。contentを引数にし、ここにview側にある一枚一枚のcontentを入れていき、
blankかどうかを判定します。ここはviewではないので<% ~ %>は必要ないということに注意!
改良版コード
<%= has_content?(@content_first.to_s) %>
<%= has_content?(@content_second.to_s) %>
<%= has_content?(@content_third.to_s) %>
<%= has_content?(@content_fourth.to_s) %>
ここは<%= ~ %>が必要になります。
これで同じコードを何回も書かずスッキリした見た目になりました。