配列の例題

下記サンプルは、いまいちどころではないのでカット。

q = ["aaa....", "bbb...", "cccc..."]
a = ["aaa....", "bbb...", "cccc..."]
q.size.times do |i|
  puts q[i]
  reply = gets.chomp
  if reply == a[i]
    puts "正解"
  else
    puts "残念"
  end
end
result = []
5.times do
  a = rand(10)
  b = rand(10)
  puts "#{a} + #{b} = ?"
  answer = gets.to_i
  if answer == a + b
    result << ""
  else
    result << "×"
  end
end
puts result

例題はより易しい配列をeachの基本パタンに書き換えた。簡単なようでブロック付きメソッドは理解しにくいし、でもこれは絶対に覚えてほしいところだから、こっちで正解だと思う。

久々にWindows上にRubyとRails環境を作ってみる

インストールしたバージョンは次の通り。

RubyのインストールとRailsのインストールを2つの段階に分けて考える。まずはRubyから。

ActiveScriptRubyのインストール

http://arton.hp.infoseek.co.jp/indexj.htmlから最新版のActiveRuby.msi(現時点では1.8.6(111))を入手。デフォルトの設定でインストール。手元の環境はWindowsXP

インストールが完了したら、「スタート」→「すべてのプログラム」→「Ruby 1.8」→「ruby console」を開く。
コマンドプロンプトが開くので「ruby -v」と入力してEnterキーを押す。

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Program Files\ruby-1.8\bin>ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]

C:\Program Files\ruby-1.8\bin>

上記のようにrubyのバージョンが表示されればインストールは成功している。これでRubyのインストールは完了。ここまでは特に難しいことはないと思う。

Railsのインストール

Rubyのインストールは上のように簡単なのだけど、Railsはいくつかの手順が必要。以下では上記手順でActiveScriptRubyがインストール済みであることを前提とする。

まずRubyGemsをインストール。

(追記:ActiveScriptRubyには最初からRubyGemsが入っています。よって以下の手順は不要でした。ただし書き手順で最新版のRubyGemsを入れても問題はありません。またこちらの手順でRubyGemsを更新することもできます。)

http://rubyforge.org/frs/?group_id=126&release_id=17305から現時点の最新版rubygems-1.0.1.tgzをダウンロードしてきて解凍(Windowsの人にはzipのほうがありがたい気がするけど、1.0.1にはzipがないですね)。

  • rubygems-1.0.1.tgz を解凍(解凍レンジとかで)
  • setup.rb を実行(通常はダブルクリック)

これでRubyGemsのインストールは完了。

>gem -v
1.0.1
次にRailsをインストール。

コマンドプロンプトで「gem install rails」と打つとインストールが始まる。gemをする場合、作業ディレクトリはどこでも構いません。数分で次のようなメッセージが表示されて完了。

>gem install rails
Successfully installed activesupport-2.0.2
Successfully installed activerecord-2.0.2
Successfully installed actionpack-2.0.2
Successfully installed actionmailer-2.0.2
Successfully installed activeresource-2.0.2
Successfully installed rails-2.0.2
6 gems installed
Installing ri documentation for activesupport-2.0.2...
Installing ri documentation for activerecord-2.0.2...
Installing ri documentation for actionpack-2.0.2...
Installing ri documentation for actionmailer-2.0.2...
Installing ri documentation for activeresource-2.0.2...
Installing RDoc documentation for activesupport-2.0.2...
Installing RDoc documentation for activerecord-2.0.2...
Installing RDoc documentation for actionpack-2.0.2...
Installing RDoc documentation for actionmailer-2.0.2...
Installing RDoc documentation for activeresource-2.0.2...

一応確認してみましょう。

>rails -v
Rails 2.0.2

Railsのインストールはこれで完了。RailsにはDBが必要なので、次にDBまわりの環境を整えておく。

SQLite3のインストール。

DBでお手軽なのは、なんといってもSQLite3。Rails 2.0.2からはSQLite3がデフォルトとなった。(勢いがありますね。それもこの便利さ故でしょう。)

SQLite Download Pageから現時点の最新版であるsqlitedll-3_5_4.zipとsqlite-3_5_4.zipをダウンロードします。Windows用のdllとexeが入っているので、どちらも解凍して、この2つのファイル(sqlite3.dllとsqlite3.exe)をRubyの実行ファイルがあるディレクトリにコピーする。デフォルトでは「C:\Program Files\ruby-1.8\bin」。

次に、Rubyからsqlie3を扱うためのライブラリsqlite3-rubyをgemでインストールする。

>gem install sqlite3-ruby
Successfully installed sqlite3-ruby-1.2.1-x86-mswin32
1 gem installed
Installing ri documentation for sqlite3-ruby-1.2.1-x86-mswin32...
Installing RDoc documentation for sqlite3-ruby-1.2.1-x86-mswin32...

上記のようなメッセージが表示されればインストールは完了。

Rails 2.0.2でブログシステム:テンプレートメモ

paginateがなくなっていっそうシンプルになった。

app/views/home/index.html.erb

<% for entry in @entries %>
  <div class="entry">
    <div class="date">
      <%= entry.created_on.year %><%= entry.created_on.month %><%= entry.created_on.day %></div>
    <h2><%=h entry.title %></h2>
    <div><%=h entry.body %></div>
    <%=link_to 'permalink', :controller => 'entries', :action => 'show', :id => entry %>
  </div>
<% end %>

showへのlink_to上記のように書くしかないのかな。同じコントローラないだともっとシンプルなのに。

app/views/layouts/application.html.erb

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
  <title>Pipin: <%= controller.controller_name %></title>
  <%= stylesheet_link_tag 'scaffold' %>
  <%= stylesheet_link_tag 'base' %>
</head>
<body>
<div class="main">

<h1>Pipin</h1>

<div class="header-menus">
  <%= link_to 'Home', :controller => 'home', :action => '' %>
  <%= link_to 'Archive', :controller => 'home', :action => 'archive' %>
  <%= link_to 'About', :controller => 'home', :action => 'about' %>
  <%= link_to '日記を書く', :controller => 'entries', :action => 'new' %>
  <%= link_to '管理', :controller => 'entries', :action => '' %>
  <%= link_to 'ログアウト', :controller => 'account', :action => 'logout' %>
</div>

<p style="color: green"><%= flash[:notice] %></p>

<%= yield  %>

</div>
</body>
</html>

ここまでのコマンド。

rails pipin
cd pipin
ruby script/generate scaffold Entry title:string body:text created_on:datetime
rake db:create
rake db:migrate

rm app/views/layouts/entries.html.erb
ruby script/generate controller Home index

Rails 2.0.2でブログシステムを作ろうと思ったけど

1系以前の知識で設計していたのだけど、ちょっとそのままでは無理っぽい。特にURLにshowとか書く必要がなくなってて、以前の直感的なURLとコントローラの対応関係が変化してる。どっちのほうがより直感的なのかは置いておくとして、とにかく変わってる。

あれ、これどういう仕組みでコントローラのshowメソッドが呼ばれるんだ?確か1.2.3までは直接URLにshowと入れていたと思うんだけど……。scaffold使ってなかったからいつからこうなったのかわからない。この辺りだいぶ前に話題になっていた気がする。いまさらだけどちゃんと調べないとね。

整理しよう。scaffoldで生成されるGETのアクションは次の4つ。

  • GET /entries → indexアクション
  • GET /entries/1 → showアクション
  • GET /entries/new → newアクション
  • GET /entries/1/edit → editアクション

indexとnewはこれまでと同じ。showとeditが不可解。showアクション、何でこれで呼び出されるんだ?

GET以外は次の3つ。これらはまあそのままなのかな。

  • POST /entries → create
  • PUT /entries/1 → update
  • DELETE /entries/1 → destroy

ちょっと生成されたソースを見た感じ、これはscaffoldのレベルの話じゃないな。

Rails 2.0.2でブログシステムを作ってみる(前編)

昨日無事にRails2.0.2がインストールできたので、今日はそれを使ってみる。

Railsでブログシステムを作る

簡単なブログを実装してみる。名前はブログのpipin。

プロジェクトの作成

rails --version    #=> Rails 2.0.2
rails pipin
cd pipin

メモ。

ここでデフォルトのDBがSQLite3になったというのを確認してみよう。

# config/database.yml

# SQLite version 3.x
#   gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
adapter: sqlite3
database: db/development.sqlite3
timeout: 5000

(略)

確かに「adapter: sqlite3」。

DBの初期化

DBを作成してくれるコマンドが追加されたらしい。これはプロジェクトを作った後に一度だけ実行する。

rake db:create

サーバーを起動

サーバーを起動してみる。

ruby script/server

ブラウザからhttp://localhost:3000/にアクセスすると、作成したプロジェクトにアクセスできる。最初は「Welcome aboard」というデフォルトのページが表示されるはず。

Aboutというページを作る

ruby script/generate controller about

app/views/about/index.html.erbというファイルを作成して、「Hello」と書き込んでおく。

ブラウザからhttp://localhost:3000/aboutにアクセスする。「Hello」と表示される。

app/views/about/index.html.erbが上記URLでアクセスしたときにブラウザに読み込まれている。

scaffoldの実行

scaffoldを実行して記事を管理するモデルと、記事を表示するコントローラを作成する。次のコマンドを実行。

ruby script/generate scaffold Entry title:string body:text updated_at:datetime created_on:datetime

メモ。

scaffoldコマンドの後ろに、コントローラ名とモデル名の両方を書く方法はなくなったのかな。ヘルプを見る限り。

次のコマンドでヘルプを見ることができる。

ruby script/generate scaffold --help

テーブルの作成

次にエントリー(ブログの記事)を保存するテーブルを作成する。テーブルの情報は、scaffoldを実行したときのオプションをもとに、db/migrate/001_create_entries.rbに定義されている。

rake db:migrate

メモ。

rakeで実行できるタスクは「rake -T」コマンドで確認できる。

コントローラにアクセスしてみる

ブラウザからhttp://localhost:3000/entriesにアクセスする。「New entry」をクリックすると、記事を作成することができる。

レイアウトを作成

app/views/layouts/entries.html.erbを削除して、新しく以下のようなapp/views/layouts/application.html.erbを作成する。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
  <title>Pipin: <%= controller.action_name %></title>
  <%= stylesheet_link_tag 'scaffold' %>
  <%= stylesheet_link_tag 'base' %>
</head>
<body>
<div class="main">

<div class="header-menus">
  <%= link_to '日記を書く', :controller => 'entry', :action => 'new' %>
  <%= link_to '管理ページ', :controller => 'entry', :action => 'list' %>
</div>

<h1>Pipin</h1>

<div class="header-menus">
  <%= link_to 'Latest', :controller => 'entry', :action => '' %>
  <%= link_to 'Archive', :controller => 'entry', :action => 'archive' %>
  <%= link_to 'About', :controller => 'about', :action => '' %>
  <% if logged_in? %>
    <%= link_to 'Logout', :controller => 'account', :action => 'logout' %>
  <% else %>
    <%= link_to 'Loign', :controller => 'account', :action => 'login' %>
  <% end %>
  <%#= link_to 'RSS', :controller => 'entry', :action => 'rss' %>
</div>

<p style="color: green"><%= flash[:notice] %></p>

<%= yield  %>

</div>
</body>
</html>

今日はここまで。