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) %>
여기에는 <%= ~ %>가 필요합니다.
이제 같은 코드를 여러 번 쓰지 않고 깔끔한 외형이 되었습니다.
Reference
이 문제에 관하여(VIEW를 DRY로 만드는 helper 기능), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tomoharutt/items/ef546a9a52a55af4539c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
자신이 투고한 책의 화상을 표시하는 기능을 만들고 있었습니다만, 만약 화상을 투고를 하지 않았던 경우, 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) %>
여기에는 <%= ~ %>가 필요합니다.
이제 같은 코드를 여러 번 쓰지 않고 깔끔한 외형이 되었습니다.
Reference
이 문제에 관하여(VIEW를 DRY로 만드는 helper 기능), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tomoharutt/items/ef546a9a52a55af4539c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
module BooksHelper
def has_content?(content)
if content.blank?
image_tag 'no_image.png'
else
image_tag content
end
end
end
<%= has_content?(@content_first.to_s) %>
<%= has_content?(@content_second.to_s) %>
<%= has_content?(@content_third.to_s) %>
<%= has_content?(@content_fourth.to_s) %>
Reference
이 문제에 관하여(VIEW를 DRY로 만드는 helper 기능), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tomoharutt/items/ef546a9a52a55af4539c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)