뭔일이 생긴겨?
scaffold :recipe 이 한 줄이 모든 걸 가능하게 만들었다. 이 코드는 데이터 모델과 작동하고, show 내용 출력, list 목록 출력, create 새로 만들기, delete 삭제 action을 만들었다. 또한 각각의 action(show, list, create, delete)의 view 템플릿을 만들었다.
물론 자동 생성된 action과 view는 여러분의 마음에 들지 않겠지만, 액션을 하나씩 추가할 때마다 기본으로 제공되는 scaffold 액션을 대신한다. 마지막으로 모든 action을 추가했을 때, scaffold를 코드에서 지우면 된다.
Rails에서 사용하는 URL에 눈여겨 보았는가? 매우 단순하지 않은가? Rails는 URL을 보기 좋게 만들기 위해서 많은 신경을 썼다.
Action과 View 만들기
우선 요리 목록을 출력하는 action을 수정해 보자. 목록 출려과 관계된 action은 list이다.
recipe_controller.rb를 열어서 list 함수를 추가하자(그림 40)
그림 40. list 함수 추가
함수를 추가한 후 http://127.0.0.1:3000/recipe/list를 웹 브라우저에 입력해 보자. 그림 41과 같이 보이나?
그림 41. list 함수 추가 후 목록 action 수행 결과(역주 : Rails 버전이 다르기 때문에 에러 메시지가 다소 다르게 보임)
list 액션을 추가했기 때문에 Rails는 더 이상 list scaffold를 사용하지 않는다. 따라서 Rails는 새로 만든 list 함수를 호출하고 여기에 대응하는 view 템플릿을 부른다. 하지만 list함수만 만들고 view 템플릿을 만들지 않았기 때문에 “Template is missing”이라는 에러 메시지를 출력한다.
list.rhtml 파일을 c:\rails\cookbook\app\views\recipe 폴더에 만든다. JSP나 ASP에 경험이 있다면 <% %>, <%= %> 태그 안에 Ruby 코드가 들어가는 걸 눈치 챘을 것이다. list.rhtml에 아래의 내용을 입력한다.
<html>
<head>
<title>All Recipes</title>
</head>
<body><h1>Online Cookbook - All Recipes</h1>
<table border=”1″>
<tr>
<td width=”80%”><p align=”center”><i><b>Recipe</b></i></td>
<td width=”20%”><p align=”center”><i><b>Date</b></i></td>
</tr><% @recipes.each do |recipe| %>
<tr>
<td><%= link_to recipe.title, :action => “show”, :id => recipe.id %></td>
<td><%= recipe.date %></td>
</tr>
<% end %>
</table>
<p><%= link_to “Create new recipe”, :action => “new” %></p></body>
</html>
recipe_controller.rb 파일에 그림 42의 코드 한 줄을 추가한다.
그림 42. 모든 요리법 목록을 출력
웹 브라우저를 Refresh하면 그림 43이 출력된다.
그림 43. 더 나아진 요리법 출력 목록
잘 어떻게 잘 작동하는지 알아 보자.
def list
@recipes = Recipe.find_all
end
웹 브라우저에 http://127.0.0.1:3000/recipe/list를 입력하면, Rails는 방금 만든 list 함수를 호출한다. 위에 추가한 코드는 recipes 테이블에 있는 모든 row를 Recipe 클래스로 가지고 와서 @recipes 변수에 저장한다.
그 다음으로 Rails는 템플릿을 찾고, 우리가 만든 템플릿에 데이터를 넘겨준다. 템플릿은 대부분 HTML이다. 아래의 태그에서 작업이 이루어진다.
<% @recipes.each do |recipe| %>
<tr>
<td><%= link_to recipe.title, :action => “show”, :id => recipe.id %></td>
<td><%= recipe.date %></td>
</tr>
<% end %>
삽입된 Ruby 코드는 controller에서 얻은 배열의 값을 하나씩 가지고 온다. 각 열의 첫 번째 cell은 요리법의 show, 세부 내용 조회 페이지에 연결된다.
요리책에 분류 체계 추가 하기
요리책에 분류 체계를 추가하고 싶다. 이를 위해서 데이터 베이스에 categories, 분류 체계 테이블을 추가한다. 모든 요리법은 하나의 분류 체계에 속하게 된다.
MySQL-Front에 categories 테이블을 추가하고, varchar(50)의 name 필드를 추가한다.(그림 44)
그림 44. categories 테이블
categories 테이블에 맵핑되는 controller와 model을 만들자.
ruby script\generate controller Category
ruby script\generate model Category
그림 45. category controller와 model 만들기
마지막으로, category controller에 scaffold 코드를 추가하자. 그림 46을 참조하자.
그림 46. scaffold 코드 추가
웹 브라우저에 http://127.0.0.1:3000/category/new를 입력하고, Snacks와 Beverages 분류 체계를 추가하자. 그림 47와 같은 결과를 얻을 수 있다.
그림 47. 분류 체계 항목 목록