VIEW를 DRY로 만드는 helper 기능

가능한 한 DRY에



모델로 스코프를 사용하는 등, 가능한 한 컨트롤러를 DRY로 해 왔기 때문에, view측도 그 흐름을 잡아 가고 싶다고 생각해, 조사했습니다. 중복한 쓰는 방법이 줄어들기 때문에 꽤 예쁘게 쓸 수 있었습니다.

이미지 파일이 있는지 여부에 따라 표시할 이미지를 나누고 싶습니다.



자신이 투고한 책의 화상을 표시하는 기능을 만들고 있었습니다만, 만약 화상을 투고를 하지 않았던 경우, noimage라고 하는 화상을 표시하고 싶고, if문을 view에 쓰고 있었습니다.
한 장만이라면 좋지만 요건적으로 같은 기능을 하나의 페이지에 4개 만들 필요가 있었습니다.


이런 녀석이네요.

초기 코드

show.html.erb

<% 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에서 사용합니다.

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측에 있는 1장 1장의 content를 넣어 가,
blank인지 어떤지를 판정합니다. 여기는 view가 아니므로 <%~%>는 필요 없다는 것에 주의!

개선 버전 코드

show.html.erb
<%= has_content?(@content_first.to_s) %>
<%= has_content?(@content_second.to_s) %>
<%= has_content?(@content_third.to_s) %>
<%= has_content?(@content_fourth.to_s) %>

여기에는 <%= ~ %>가 필요합니다.
이제 같은 코드를 여러 번 쓰지 않고 깔끔한 외형이 되었습니다.

좋은 웹페이지 즐겨찾기