Bucket Place/Ruby on Rails

[Ruby on Rails] Partial templates

Cloud Travel 2014. 5. 1. 14:11


  들어가면서... 

 

 Rails에 대한 글을 쓰면서 여러군데서 밝혔지만 여기에는 정답이 아닌 글들이 많다. 왜냐하면, 필자가 직접 사용하면서 느낀점을 토대로 작성하는 것이 많기 때문이다. 다른 곳에선 Partial Template를 어떻게 설명했는지 모르지만, 사용한 결과 느낀점은 테이블마다 보여주는 형식이 동일할 경우 이를 하나로 묶어 주는 역할을 한다이다.


 중복적으로 사용하는 부분을 하나로 묶는 방법이 없을까? 일반적으로 하나의 테이블에 대해서 각각이 보여주는 형식은 동일할 가능성이 높다. 이런 가능성에 대해서 테이블마다 하나의 대표적인 템플릿을 작성할 수 있는데 이것을 바로 Partial Template라고 생각한다.



  Partial Templates 


 그렇다면  Partial Templates 는 무엇일까? 일반적인 책에서는 다음과 같이 설명을 해준다.

  - 별도 파일로 존재하는 뷰의 집합요소 중 하나이다.

  - 매개 변수를 받아서 데이터를 보여줄 수 있다.

  - 컨트롤러나 다른 뷰, 템플릿에 의해 호출된다.

 필자는 여기에 추가적으로 느낀점을 붙여본다.

  - Table에서 자주쓰는 출력형식을 템플릿으로 저장해 놓은 뷰

 

 Partial Templates의 생성위치는  app/views/[Table_Name] 위치에 생성하면 된다. 파일이름을 작성할 때에는 prefix로 '_'가 들어가며, Table이름이 뒤에 붙는다. 즉,  _[Table_Name].html.erb 가 된다. 예를 들어, friend 테이블에 대한 Partial Templates는 다음과 같이 생성할 수 있다.

 > vi app/friend/_friend.html.erb


 사용하는 곳에서는 <%= render(parameter) %>로 호출을 해준다. 이렇게 호출을 해주면 parameter의 클래스를 찾아가 어떤 테이블에 해당하는 지를 판단하고, 그 테이블의 Partial Template를 찾아간다.


 위에서 밝혔듯이 Partial는 Table에 대한 튜플데이터(Tuple Table)들을 매개변수로 받아서 뷰를 보여주는 일을 많이 한다. Partial내부에서는 받아온 매개변수를 자신의 이름, 테이블 이름으로 사용한다. 또한, 데이터들을 모두 출력해줄때까지 자동으로 순회(Iterator)를 한다.



  Partial Templates 사용해보기 


 이제 실질적으로 Partial Templates 를 사용해보자. 이제부터는 새롭게 프로젝트를 생성하여 실습을 진행해보려고 한다.

 자, 프로젝트생성부터 시작을 해보자.

> rails new partial

....

> cd partial

> rails s


 프로젝트를 생성하여 서버를 키는것까지 하였다. 이번에는 새로운 터미널을 열어서 partial 프로젝트로 이동을 하고, 테이블을 하나 추가해보자.

> cd partial

> rails generate scaffold book title:string description:text price:decimal

....

> rake db:migrate


 프로젝트에 book 테이블을 추가하였다. book 테이블은 3개의 Attribute를 가지고 있다. (title(string), description(text), price(decimal)). 이제  localhost:3000/book 으로 접근을 하여 테스트 데이터를 몇개 만들어 주자. 이제는 partial를 사용하지 않았다고 가정하고 책들의 리스트를 보여주는 페이지를 하나 만들어주자.

> rails generate controller list index


 컨트롤러를 하나 만들었다. 이젠 이 컨트롤러에서 book 테이블의 모든 정보를 받아오고, 이를 출력해주는 소스코드를 작성해보았다. 일단, 컨트롤러부터 수정을 해주자.

 app/controller/list_controller.rb

class ListController < ApplicationController
  def index
    @books = Book.order(:title)
  end 
end

이번에는 뷰를 수정해주자. 뷰에서는 단순히 책들을 리스트 형식으로 출력하는 일만을 한다.

app/views/list/index.html.erb

<h1>Book List View</h1>

<ul>
  <% @books.each do |book| %>
  <li>
    <p>Title : <%= book.title %></p>
    <p>Description : <%= book.description %></p>
    <p>Price : <%= book.price %></p>
  </li>
  <% end %>
</ul>

 저장을 하고  localhost:3000/list/index 로 접근을 하면 책들의 리스트가 나오는 것을 볼 수 있다. 이제는 Partial 를 사용하여 뷰에서 하는 일을 간략화해보자. Partial 파일을 생성해보자. book테이블에 대해서 수행을 할 것이기 때문에 다음의 파일을 작성해주면 된다.

app/views/books/_book.html.erb

<li>
  <p>Title: <%= book.title %></p>
  <p>Description: <%= book.description %></p>
  <p>Price: <%= book.price %></p>
</li>

  app/views/list/index.html.erb에서 테이블 데이터를 사용하는 <li> 부분만을 가져온 형태이다. 이제 app/views/list/index.html.erb를 수정하여 partial를 사용해보자.

app/views/list/index.html.erb

<h1>Book List View</h1>

<ul>
  <%= render(@books) %>
</ul>

 이제 View페이지를 새로고침하면 제대로 나오는 것을 볼 수 있다. 컨트롤러에서 books의 테이블을 알게되고 이에 대한 Partial를 부른다고 볼 수있다.



   Partial Templates의 장점


 간단하게 Partial를 사용해보았다. 여기서의 장점은 무엇이 있을가?

 

 일단, 뷰를 나눠 작성함으로써 복잡했던 뷰의 일이 줄어들게 되었다. 또한, Partial를 다른 곳에서 재사용하여 계속 사용이 가능하다. 특히, 이는 테이블마다 보여지는 행식이 어느 페이지에도 같이 적용될 경우 강력한 힘을 가질 것이다.



  마치며...


 Partial 신기하다. 라는 느낌밖에 들지 않았다.


partial.zip