配列の例題
下記サンプルは、いまいちどころではないのでカット。
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の基本パタンに書き換えた。簡単なようでブロック付きメソッドは理解しにくいし、でもこれは絶対に覚えてほしいところだから、こっちで正解だと思う。
t.timestamps
[Ruby] Ruby on Rails 2.0 を試してみた - yuumi3のお仕事日記
t.timestamps とうのが追加されてます、これを書くと created_at, updated_at カラムが追加されるそうです。
手元のコードもこれに書き換えておかないと。
久々にWindows上にRubyとRails環境を作ってみる
インストールしたバージョンは次の通り。
- ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
- rails-2.0.2
- sqlite-3_5_4
- sqlite3-ruby-1.2.1-x86-mswin32
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
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>
今日はここまで。