1) 없는 컬럼 추가하기
Iteration 1 에서 Product 테이블을 만들었고, 페이지에서 데이터를 추가하고 빼고 하는 페이지들을 만들어 봤다.
Iteration 2 시작에서는 필요한 컬럼중 초기에 만들지 않은 컬럼을 테이블에 추가해 보기로 하겠다.
가격(Price) 컬럼을 만들어 보겠다.
depot> ruby script/generate migration add_price_toProduct price:decimal
위의 명령어를 치게 되면 아래와 같은 .rb 즉 루비 파일이 생성된다.
db/migrate/20080601000002_add_price_to_product.rb
더보기 접기
class AddPriceToProduct < ActiveRecord::Migration
def self.up
add_column :products, :price, :decimal,
:precision => 8, :scale => 2, :default => 0
end
def self.down
remove_column :products, :price
end
end
접기
Coordinated Univeral Time, UTC 를 토대로 파일이 만들어지며, 파일 이름은 YYYYMMDDhhmmss 형태로 시간으로 형성된다. 위의 파일을 열면 아래 링크와 같은 코드를 볼 수 있을 것이다.
http://media.pragprog.com/titles/rails3/code/depot_a/db/migrate/20080601000002_add_price_to_product.rb
관련된 설명은 생략하겠다. 지금은 그냥 보기만 해도 프로그램을 해본 지식이 있는 분들이라면 알아볼 수 있을것이다.
이해가 안되더라도 지금은 크게 문제가 되지 않는다.
depot> rake db:migrate
명령어를 치면 Rails 는 위에 만들어진 루비 파일을 적용시킨다.
(주의 할점: 가격 변수 형태를 Decimal 로 잡았다. Float 으로 잡지 않은 이유는 반올림시 Float 형태는 오류가 있기 때문이다. )
다음은 Views 쪽 파일들을 열어 필요한 부분을 수정해야 한다.
depot/app/views/products/index.html.erb
더보기 접기
<h1>Listing products</h1>
<table>
<tr>
<th>Title</th>
<th>Description</th>
<th>Image url</th>
<th>Price</th>
</tr>
<% for product in @products %>
<tr>
<td><%=h product.title %></td>
<td><%=h product.description %></td>
<td><%=h product.image_url %></td>
<td><%=h product.price %></td>
<td><%= link_to 'Show', product %></td>
<td><%= link_to 'Edit', edit_product_path(product) %></td>
<td><%= link_to 'Destroy', product, :confirm => 'Are you sure?',
:method => :delete %></td>
</tr>
<% end %>
</table>
<br />
<%= link_to 'New product', new_product_path %>
접기
depot/app/views/products/new.html.erb
더보기 접기
<h1>New product</h1>
<% form_for(@product) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :title %><br />
<%= f.text_field :title %>
</p>
<p>
<%= f.label :description %><br />
<%= f.text_area :description, :rows => 6 %>
</p>
<p>
<%= f.label :image_url %><br />
<%= f.text_field :image_url %>
</p>
<p>
<%= f.label :price %><br />
<%= f.text_field :price %>
</p>
<p>
<%= f.submit "Create" %>
</p>
<% end %>
<%= link_to 'Back', products_path %>
접기
depot/app/views/products/edit.html.erb
더보기 접기
<h1>Editing product</h1>
<% form_for(@product) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :title %><br />
<%= f.text_field :title %>
</p>
<p>
<%= f.label :description %><br />
<%= f.text_area :description %>
</p>
<p>
<%= f.label :image_url %><br />
<%= f.text_field :image_url %>
</p>
<p>
<%= f.label :price %><br />
<%= f.text_field :price %>
</p>
<p>
<%= f.submit "Update" %>
</p>
<% end %>
<%= link_to 'Show', @product %> |
<%= link_to 'Back', products_path %>
접기
여기까지 수정이 완료 되어 페이지들을 확인해 보면 Price 컬럼이 추가되어 있는걸 볼 수 있다.
서버를 돌리고 있었다 하더라고 다시 실행할 필요가 없는 이유는 페이지에서 Model 에 요청이 들어가면 최근 업데이트된 db 스키마로 자동 업데이트 되기 때문이다.
Download depot_a/app/views/products/show.html.erb
더보기 접기
<p>
<b>Title:</b>
<%=h @product.title %>
</p>
<p>
<b>Description:</b>
<%=h @product.description %>
</p>
<p>
<b>Image url:</b >
<%=h @product.image_url %>
</p>
<p>
<b>Price:</b>
<%=h @product.price %>
</p>
<%= link_to 'Edit', edit_product_path(@product) %> |
<%= link_to 'Back', products_path %>
접기
Markup 이 함께 보여지고 싶다면 h 를 제거 하면 된다.
depot/app/views/products/show.html.erb
더보기 접기
<p>
<b>Title:</b>
<%=h @product.title %>
</p>
<p>
<b>Description:</b>
<%= @product.description %>
</p>
<p>
<b>Image url:</b >
<%=h @product.image_url %>
</p>
<p>
<b>Price:</b>
<%=h @product.price %>
</p>
<%= link_to 'Edit', edit_product_path(@product) %> |
<%= link_to 'Back', products_path %>
접기