バリケンのRuby日記 RSSフィード

2006-06-22

[][][] Subversionの練習  Subversionの練習 - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  Subversionの練習 - バリケンのRuby日記  Subversionの練習 - バリケンのRuby日記 のブックマークコメント

今日は久しぶりに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

うーん、けっこう面倒だねえ。頻繁にチェックインしすぎかなあ?

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20060622