2006-06-22
■ [Ruby][Rails][Subversion] Subversionの練習

今日は久しぶりにRuby on Railsに戻ってみるよ。
Ruby on Railsで開発するときにはSubversionというバージョン管理ツールを使うといいみたいだから、Subversionの使い方を練習してみることにするよ。
まずは、Subversionのインストール。
# aptitude install subversion
もちろんRails自体のインストールも必要だよ。ちなみにDebian系のLinuxディストリビューションにRailsをインストールする手順はこちらがよくまとまっていると思うよ。
じゃあ、以前の日記でもネタにしたTinyURLでやってみることにするよ。
作業ディレクトリへの移動
$ cd Rails
プロジェクトの開始
$ rails Tinyurl $ cd Tinyurl
subversionのレポジトリの作成
$ mkdir ~/subversion $ svnadmin create --fs-type fsfs ~/subversion/rails.tinyurl
レポジトリにインポートする
$ svn import . file:///home/ユーザー名/subversion/rails.tinyurl
エディタが立ち上がるので、「create project」と編集して保存するよ。
いったん削除して、チェックアウトしなおす
$ cd .. $ rm -rf Tinyurl $ svn co file:///home/ユーザー名/subversion/rails.tinyurl Tinyurl $ cd Tinyurl
database.ymlの移動
$ svn move config/database.yml config/database.example.yml $ svn ci -m 'move database.yml' $ svn update
database.ymlを無視ファイルに指定
database.ymlは動作環境によって異なるから、subversionの管理下から除外するよ。
$ svn propset svn:ignore "database.yml" config/ $ svn ci -m 'add ignore config/database.yml' $ svn update
ログファイルを削除し、無視ファイルに指定
ログファイルは動作環境によって異なるから、subversionの管理下から除外するよ。
$ svn remove log/* $ svn ci -m 'rm logfile' $ svn update $ svn propset svn:ignore "*.log" log/ $ svn ci -m 'add ignore ./log/*.log' $ svn update
config/database.ymlのコピー
$ cp config/database.example.yml config/database.yml
config/database.ymlの編集
$ vi config/database.yml
データベースの作成
$ vi db/create_database.sql
次のような内容とするよ。
CREATE DATABASE Tinyurl_development CHARACTER SET utf8; CREATE DATABASE Tinyurl_test CHARACTER SET utf8; CREATE DATABASE Tinyurl_production CHARACTER SET utf8;
作成したファイルをsubversionの管理下に置くよ。
$ svn add db/create_database.sql $ svn ci -m 'edit db/create_database.sql' $ svn update
データベースを作成するよ。
$ mysql -uroot -p < db/create_database.sql
モデルの生成
$ ruby script/generate model Map
生成したファイルはsubversionの管理下に置くよ。
$ svn add app/models/map.rb $ svn add test/unit/map_test.rb $ svn add test/fixtures/maps.yml $ svn add db/migrate/ $ svn ci -m 'create app/models/map.rb' $ svn update
テーブルの作成
$ vi db/migrate/001_create_maps.rb
次のように編集するよ。
class CreateMaps < ActiveRecord::Migration def self.up create_table :maps do |t| t.column :token, :string t.column :url, :string t.column :created_on, :time end end def self.down drop_table :maps end end
チェックインするよ。
$ svn ci -m 'edit db/migrate/001_create_maps.rb' $ svn update
テーブルを作成するよ。
$ rake migrate
モデルの編集(app/models/map.rb)
$ vi app/models/map.rb
次のように編集するよ。
class Map < ActiveRecord::Base validates_presence_of :url validates_format_of :url, :with =>/:\/\// def before_create self.token = Map.generate_token(5) end def tinyurl ['http://localhost:3000', self.token].join '/' end private def self.generate_token(i=5) chars = ['a'..'z', 'A'..'Z', '0'..'9'].map {|r| r.to_a }.flatten token = '' i.times do token << chars[rand(chars.length)] end return token end end
チェックインするよ。
$ svn ci -m 'edit app/models/map.rb' $ svn update
コントローラーの生成
$ ruby script/generate controller Map index create redirect
生成されたファイルをsubversionの管理下に置くよ。
$ svn add app/views/map $ svn add app/controllers/map_controller.rb $ svn add test/functional/map_controller_test.rb $ svn add app/helpers/map_helper.rb $ svn ci -m 'create app/controllers/map_controller.rb' $ svn update
コントローラーの編集(app/controllers/map_controller.rb)
$ vi app/controllers/map_controller.rb
次のように編集するよ。
class MapController < ApplicationController def index @map = Map.new end def create @map = Map.find_by_url(params[:map][:url]) unless @map @map = Map.new(params[:map]) unless @map.save render :action => 'index' end end end def redirect map = Map.find_by_token(params[:token]) redirect_to(map.url) if map end end
チェックインするよ。
$ svn ci -m 'edit app/controllers/map_controller.rb' $ svn update
ルータの設定(config/routes.rbの編集)
$ vi config/routes.rb
「Add your own custom routes here.」の下あたりに次を追加するよ。
map.connect ':token', :token => /\w{5}/, :controller => 'map', :action => 'redirect'
チェックインするよ。
$ svn ci -m 'edit config/routes.rb' $ svn update
ビューの編集(app/views/map/_form.rhtml)
$ vi app/views/map/_form.rhtml
次のように編集するよ。
<%= form_tag :action => 'create' %>
<%= text_field("map", "url", :size => 40) %>
<%= submit_tag("TinyURL!") %>
<%= end_form_tag %>
作成したファイルはsubversionの管理下に置くよ。
$ svn add app/views/map/_form.rhtml $ svn ci -m 'create app/views/map/_form.rhtml' $ svn update
ビューの編集(app/views/map/index.rhtml)
$ vi app/views/map/index.rhtml
次のように編集するよ。
<%= render :partial => 'form' %>
チェックインするよ。
$ svn ci -m 'edit app/views/map/index.rhtml' $ svn update
ビューの編集(app/views/map/create.rhtml)
$ vi app/views/map/create.rhtml
<p>The following URL:</p> <p><%=h @map.url %></p> <p>has a length of <%= @map.url.size %> characters and resulted in the following TinyURL which has a length of <%=h @map.tinyurl.size %> characters:</p> <p><%=h @map.tinyurl %></p> <%= render :partial => 'form' %>
チェックインするよ。
$ svn ci -m 'edit app/views/map/create.rhtml' $ svn update
レイアウト(ビュー)の編集(app/views/layouts/map.rhtml)
$ vi app/views/layouts/map.rhtml
次のように編集するよ。
<html>
<head>
<title>TinyURL on Rails</title>
</head>
<body>
<h1>TinyURL!</h1>
<%= error_messages_for('map') %>
<p style="color: green"><%= flash[:notice] %></p>
<%= @content_for_layout %>
</body>
</html>
作成したファイルをsubversionの管理下に置くよ。
$ svn add app/views/layouts/map.rhtml $ svn ci -m 'create app/views/layouts/map.rhtml' $ svn update
テスト用Webサーバの起動
$ ruby script/server
ブラウザでアクセスして動作確認
http://localhost:3000/map/index
うーん、けっこう面倒だねえ。頻繁にチェックインしすぎかなあ?