Railsで作る最も簡単なブログシステム(2)

Railsで作る最も簡単なブログシステム(1) - dan5yaの日記の続きです。

ジェネレートコマンドの意味

前回はRailsプロジェクトを作った後に、次のコマンドを実行しました。

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

これはscaffold(足場)という雛形を作るコマンドです。

コマンドの先頭部分を見てください。実はこれはrubyコマンドを使ってRubyスクリプトを実行しています。

ruby script/generate

上の部分だけを見れば、script/generateというソースファイルを実行しているように見えます。事実その通りで、後ろに続く文字列はオプションに過ぎません。

script/generateは、いろんな雛形を生成するスクリプトです。script/generateの使い方は、次のようにすると大体わかります。

ruby script/generate --help

これでscript/generateスクリプトのヘルプが表示できます。表示されるヘルプの「Installed Generators」のところを見ると、使用できるジェネレーターを確認できます。ここには「scaffold」も含まれています。

オプションの1つ目には、ジェネレータを指定します。上では「scaffold」を指定しました。次のようにすると「scaffold」についてのヘルプを表示できます。

ruby script/generate scaffold --help

このヘルプでも確認できますが、scaffoldに続くオプションは、モデル名とフィールド情報です。フィールド情報は省略可能です。

ruby script/generate scaffold Entry title:string body:text created_at:datetime
                               ↑         ↑         ↑            ↑
                            モデル名    フィールド情報

モデル名はEntryとしています。
また、次のようなフィールド情報をオプションに指定しています。

title:string body:text created_at:datetime

上のフィールド情報から、次のようなカラムがDBのentriesテーブルに作成されることになります。

||!カラム名  ||!カラム型 || 備考
|| title     || string   || 記事のタイトル
|| body      || body     || 記事の本文
|| created_at|| datetime || 記事の作成日時

上記のテーブル情報は、Migration定義ファイルに記録されています。具体的には、ジェネレートコマンドを実行したときに生成されたdb/migrate/001_create_entries.rbに書かれています。Migrateion定義ファイルの内容は「rake db:migrate」コマンドを実行したときに、DBに反映されます。

レイアウトの作成

次にレイアウトファイルを作成します。

新規にapp/views/layouts/application.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.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 => 'users', :action => 'logout' %>
</div>

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

<%= yield  %>

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

scaffoldをジェネレートした時に、app/views/layouts/entries.html.erbというファイルが作成されているはずです。すべてのページのレイアウトでapplication.html.erbを使いたいので、こちらは削除してください。

レイアウトファイルが準備できたら、もう一度ブラウザから次のURLにアクセスしてください。

http://localhost:3000/entries

TODO.SS /entries

いくつかのメニューが追加されているはずです。「日記を書く」「管理以外」のリンクは、まだ有効になっていないので、クリックしてもまだページを開くことは出来ません。

トップページを作る

「Home」画面を作ります。Home画面は、ブログのトップページです。最終的にはこのページを開くと最新の記事を5件表示されるようにします。

新しくHomeコントローラを作成します。コマンドプロンプト(シェル)から次のコマンドを実行してください。

ruby script/generate controller Home index

これでHomeコントローラーがジェネレートされました。

ブラウザから次のURLにアクセスしてください。

http://localhost:3000/home

TODO.SS /home

ブラウザで開いた画面には「Find me in app/views/home/index.html.erb」と表示されています。app/views/home/index.html.erbをエディタで開いてみてください。今ブラウザで開いている画面は、このファイルの中身です。このビューファイルを書き換えると、ブラウザで表示されているページの内容が書き換わります。

app/views/home/index.html.erbを次のように書き換えてください。

app/views/home/index.html.erb

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

上のビューファイルは、@entriesという変数を必要としているので、コントローラこの@entriesを準備する必要があります。app/controllers/home_controller.rbを開いて、indexメソッドの中に次の1行を書き込んでください。

class HomeController < ApplicationController

  def index
    @entries = Entry.find(:all, :order => "created_at DESC")    # この行を追加する
  end
end

ブラウザから次のURLをリロードしてください。

http://localhost:3000/home

TODO.SS /home

記事が登録されていれば、記事が日付の新しい順に表示されるはずです。(記事は「日記を書く」をクリックすれば作成できます。)

コントローラのジェネレートについては、次のコマンドで表示されるヘルプを参考にすることができます。

ruby script/generate controller --help

まとめ

ここまでに作ったものをブラウザで確認すると、かなりブログっぽくなったのがわかると思います。

今回の作業をまとめます。

  1. レイアウトの作成
    1. app/views/layouts/application.html.erb を作成する(共通レイアウト)
    2. app/views/layouts/entries.html.erb を削除する
    3. ブラウザで確認 → http://localhost:3000/entries
  2. トップページの作成
    1. Homeコントローラの作成。コマンド実行 → ruby script/generate controller Home index
    2. app/views/home/index.html.erb を書き換える(トップページのビュー)
    3. app/controllers/home_controller.rb に1行追記する(トップページのアクション)
    4. ブラウザで確認 → http://localhost:3000/home

レイアウトとトップページが作成されました。

Railsで作る最も簡単なブログシステム(3) - dan5yaの日記に続きます。

Railsで作る最も簡単なブログシステム(1)

最も簡単じゃなかったらごめんなさい。

  • Rails 2.0.2対応です。
  • 総まとめ(全部出来たら書く)

さて、準備は整いましたでしょうか。次の3つが終わっていればOKです。

  1. Rubyのインストール → WindowsでRubyを始める方法 - dan5yaの日記
  2. Railsのインストール → WindowsでRailsを使う(おさらい) - dan5yaの日記
  3. DB(SQLite3)のインストール → WindowsでSQLite3を使う(おさらい) - dan5yaの日記

Railsを利用して、とってもシンプルなブログシステムを作成しみましょう。これはRailsに慣れるためのすごく簡単なチュートリアルです。

プロジェクトの作成

それではコマンドプロンプト(シェル)を開いてください(コマンドプロンプトの準備について)。作業ディレクトリを開いたら、まずそこにRailsプロジェクトを作成します。プロジェクトの名前はPipinとします。

次のコマンドを打ち込んでください。

rails pipin

railsコマンドが実行されると、次のようなメッセージが表示されます。

create
create  app/controllers
create  app/helpers
create  app/models
create  app/views/layouts
(略)

これでプロジェクトが作成されました。上記のログは作成されたファイルやディレクトリを示しています。

cdコマンドで、カレントディレクトリを今作成したpipinディレクトリに移します。

C:\work>cd pipin

C:\work\pipin>

ここかプロジェクトのホームディレクトリとなります。以降のコマンドは、すべてここをカレントディレクトリとして実行してください。

scaffoldの作成

これからブログシステムを作るわけですが、まず最初はgenerateスクリプトを使ってブログ記事の管理画面を作ります。次のコマンドを実行してください。

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

実行結果は、次のようになります。

      exists  app/models/
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/entries
      exists  app/views/layouts/
      (略)
      create  app/helpers/entries_helper.rb
       route  map.resources :entries

上記コマンドにより、次のファイルがジェネレートされました。

  • Entryモデル …… app/models/entry.rb
  • Entriesコントローラ …… app/controllers/entries_controller.rb
  • entriesビュー …… app/views/entries/ ディレクトリ以下のerbファイル
  • Migration定義ファイル …… db/migrate/001_create_entries.rb
  • テストに必要なファイル群 …… testディレクトリの各サブディレクトリ以下

他にもありますが、上記のものが特に重要なファイルです。

DBの初期化

Migration定義ファイルは、DBを初期化するためのスクリプトです。以下のコマンドでDBを初期化しましょう。

 rake db:create    # ← DBにSQLite3を使っている場合は不要
 rake db:migrate

実行結果です。

(in C:/work/pipin)
== 1 CreateEntries: migrating =================================================
-- create_table(:entries)
-> 0.1090s
== 1 CreateEntries: migrated (0.1090s) ========================================

これで記事を管理するentriesテーブルがDBに作成されました。

サーバーを起動

それではここでサーバーを起動します。

次のコマンドでサーバーを起動できます。

ruby script/server

サーバーが起動すると、次のようなメッセージが表示されます。

=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2008-01-24 13:45:47] INFO  WEBrick 1.3.1
[2008-01-24 13:45:47] INFO  ruby 1.8.6 (2007-09-24) [i386-mswin32]
[2008-01-24 13:45:47] INFO  WEBrick::HTTPServer#start: pid=3000 port=3000

ブラウザからアクセス

サーバーが起動すると、ブラウザからアクセスすることが出来ます。ブラウザで次のURLにアクセスしてみてください。

http://localhost:3000/entries

(もしもRailsプロジェクトが、ブラウザを実行するPCと別のPCに置いてある場合は、localhostの部分をそのPCのIPアドレスドメインに置き換えてください。)

このURLにアクセスすると、次のような画面が開きます。

TODO.SS /entries

ここは、ブログの記事の一覧を表示する画面です。まだ記事は一件も登録されていませんので、何も表示されません。「New entry」をクリックすると、記事を新規作成することが出来ます。

TODO.SS /entries/new

TitleとBodyを入力して、「Create」をクリックしてください。(日本語を入力する場合は、ブラウザの文字エンコーディングUTF-8にしてください。)

記事を作成すると、また最初の画面に戻ります。今度はここに作成した記事が追加されています。いくつか記事を作成したり、消したりしてみてください。ここで操作できるページは、最初にgenerateコマンドで生成したファイルによって実現されています。

SQLite3のデータファイル

ちなみに、ここで作成・編集した記事はDBに保存されています。DBにSQLite3を使っている場合は、dbディレクトリにあるファイルdevelopment.sqlite3に情報が保存されています。このファイルを消すと、すべてのデータを消すことができます。ファイルを消した場合は、次のコマンドを実行して、再びDBを初期化してください。

rake db:migrate

これで、もう一度、新しいデータファイルが作成されます。

SQLite3は、データがファイルとして管理されているので、簡単にバックアップを取ったり、データを差し替えたり、削除したりできます。

まとめ

今回の手順をまとめます。

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

上記コマンドを実行し、ブラウザから次のURLを開けば、Railsサーバーにアクセスできます。

WindowsでSQLite3を使う(おさらい)

これは以前書いた通りなので、手順だけを以下に示す。

  1. SQLite Download Pageからsqlite-3_5_4.zipとsqlitedll-3_5_4.zipを落としてきて、解凍したexeとdllをRubyの実行ファイルと同じディレクトリに入れる。
  2. gem install sqlite3-ruby

以上。

ちなみにDBのテストは次のコマンドで。

rails hoge
cd hoge
rake db:create
rake db:migrate

db:createはSQLite3だと"db/development.sqlite3 already exists"となるかも。これはこれでOK。
db:migrageを実行しても、まだMigration定義ファイルがないから何も作られないけど、エラーが出なければOK。

WindowsでRailsを使う(おさらい)

久々にRailsに触れる時間が出来た。今日はWindowsRailsを使う方法をおさらいしておこう。

ActiveScriptRubyを使うのだけど、ふとあることが頭をよぎる。あれ、RubyGemsってActiveScriptRubyに最初から入ってなかったっけ?確かめる……。やっぱり入ってた。前回の記事には、その辺を追記しておこう。

ActiveScriptRubyをインストールすると(インストールの話はこちら)、つまり、もうgemコマンドが使える状態にある。コマンドプロンプトコマンドプロンプトの使い方はこの記事を参照)を開いて、「gem -v」と入力する。コマンドプロンプトのカレントディレクトリはどこでもよい。

C:\Program Files\ruby-1.8\bin>gem -v
0.9.4

ふむ、バージョンは0.9.4だ。

RubyGemsの更新

RubyGemsを最新版にあげておこう。最新版のgemはRailsを入れるときにいちいち質問してこないからうれしい。

RubyGemsを更新するコマンドは次の通り。

gem update --system

上のコマンドを実行すると、次のようなログが流れる。

Updating RubyGems...
Attempting remote update of rubygems-update
Successfully installed rubygems-update-1.0.1
Updating version of RubyGems to 1.0.1
Installing RubyGems 1.0.1
install -c -m 0644 rbconfig/datadir.rb C:/Program Files/ruby-1.8/lib/ruby/site_r
uby/1.8/rbconfig/datadir.rb
(略)
...done.
No library stubs found.
RubyGems system software updated

これでRubyGemsのアップデートが終了。確認しておこう。

C:\Program Files\ruby-1.8\bin>gem -v
1.0.1

ふむ、OK。

Railsのインストール

ではRailsをインストール。

gem install rails

もしかしたら次のようなエラーが出るかもしれない。でもあきらめずにもう一度同じコマンドを実行してみよう。運が悪くなければ今度はインストールに進むとと思う。

Bulk updating Gem source index for: http://gems.rubyforge.org
ERROR:  While executing gem ... (Gem::GemNotFoundException)
    Could not find rails (> 0) in any repository

次のようなログが流れればインストールは完了。5分くらいかかった。

Bulk updating Gem source index for: http://gems.rubyforge.org
Successfully installed rake-0.8.1
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...

よし、順調にRialsをインストールできたぞ。次はDB(SQLite3)の準備だ。

まとめ

  1. ActiveScriptRubyをインストール
  2. gem update --system
  3. gem install rails

これだけ。

鳥を撃ち落す

whileを使った繰り返し処理をもう少し練習してみましょう。
本節で紹介するのは、乱数で特定の値がでるまで処理が繰り返されるプログラムです。

  1. while trueでループを作る
  2. 特定の条件が成立したときにbreakでループを抜ける
  3. 変数を使ってループ回数を数える
puts "おいしそうな鳥を発見!"
ct = 0
while true
  ct += 1
  puts "矢を放った!"
  sai = rand(6) + 1
  if sai == 6
    puts "当り!"
    break
  else
    puts "ハズレ"
  end
end
puts "#{ct}回目で撃ち落しました。"

while文を使ってループをひとつ作っています。while文の条件式にはtrueを与えているので、このループはbreakが実行されるまで終了しません。

breakが実行される条件は次の通りです。変数saiにさいころの目を代入します。saiには1〜6の値がランダムで代入されます。

Rubyをはじめるには

Rubyをインストールする以前の話です。

これからプログラミングを始めよう、よくわからないけど評判がいいからRubyというものを使ってみようという人がRubyで「Hello, World」にたどり着くまで、どんなことが必要になるかな。

(このエントリは先日のインストールについての話の補足です)

Rubyプログラミングに必要なもの

Rubyでプログラミングを行うには次のものが必要です。

  1. パソコン(Windowsの人が多いかな)
  2. Ruby本体
  3. エディタ(メモ帳じゃちょっと。エディタって知ってるのかな)
  4. コマンドプロンプト(これは知らないよね。Windowsに最初からインストールされている)

これらがあればすぐにRubyのプログラミングを始めることができます。

パソコン

WindowsXPVistaがあればOK。ここでは解説しませんが、Unix系のOSやMacでもRubyを使うことができます。

Ruby本体

パソコンにRubyをインストールする必要があります。WindowsならActiveScriptRubyがおすすめです。詳しいインストール方法はこちら

エディタ

エディタというのはテキストファイルを編集するアプリケーションのことです。Windowsには標準で「メモ帳」というエディタが用意されています。

メモ帳は「スタート」→「すべてのプログラム」→「アクセサリ」→「メモ帳」から起動することができます。

TODO:メモ帳のSS

メモ帳はシンプルで使いやすいエディタですが、プログラミングに使うには機能が貧弱です。

世の中にはプログラミングに使うことを前提として開発されたエディタがたくさんあります。例えばTeraPadはとてもシンプルなテキストエディタですが、プログラミングに必要な最低限の機能を備えています。TeraPadはホームページからダウンロードして無料で使用することができます。

TODO:TeraPadのSS

無料で利用できるすばらしいエディタはTeraPadの他にもたくさんあります。是非自分にあったエディタを探してみてください。

コマンドプロンプト

コマンドプロンプトWindowsに用意されているシェル形式のアプリケーションです。コマンドプロンプトにコマンドを入力することで、パソコンと対話するような形でシステムを操作することができます。

WindwosXPでは「スタート」→「すべてのプログラム」→「アクセサリ」→「コマンド プロンプト」で開くことができます。コマンドプロンプトが起動すると、次のようなウィンドウが開きます。

TODO:コマンドプロンプトのSS

コマンドプロンプトが開いたら「time」と入力して、Enterキーを押してみましょう。

TODO:コマンドプロンプトにtimeを入力した結果のSS

上のように現在の時刻が表示されます。ここに時間を入力するとパソコンの時間設定を変更することができます。ここでは何も入力せずにEnterキーを押してください。timeコマンドが終了します。exitと入力するとコマンドプロンプトを閉じることができます。

コマンドプロンプトを使うと、プログラムから画面に文字を表示させたり、文字の入力を求めたりすることができます。Rubyのプログラムもこのコマンドプロンプトを使って実行することができます。

WindowsでRubyを始める方法

先日WindowsでRailsを使う方法について書いたが、ここではWindowsRubyを使う方法についてより詳しく紹介する。

まず、WindowsRubyを使う方法はいくつかの種類があって、初心者はどれを選べばいいのかよくわからないと思う。私はいつも初心者にはActiveScriptRubyを紹介している。インストールやアンインストールが簡単な上に、Windowsに対して余計なことを行わないのがよい。PATH環境変数やらを勝手にセットしないので、変な混乱が起こりにくい。またパス環境を設定した状態でコンソールを開いてくれるショートカットを用意してくれるので、インストール後すぐに動作確認ができる。

ActiveScriptRubyの入手

http://arton.hp.infoseek.co.jp/indexj.htmlにて配布されています。2008年1月時点での最新版はActiveScriptRuby 1.8.6(111)です。上記サイトからActiveRuby.msiをダウンロードしてくればOKです。

インストール

ダウンロードしたActiveRuby.msiをダブルクリックして起動します。

すると次のようにActiveScriptRubyのインストーラーが起動します。メッセージは英語ですが手順は簡単です。手順としてはメッセージに従い「Next >」ボタンを3回押すだけです。以下に具体的な流れを紹介します。

SS(あとで張る)

「Next >」をクリックしてください。

次にインストール先のディレクトリをする画面になります。

SS(あとで張る)

「Next >」をクリックしてください。デフォルトでは「C:\Program Files\ruby-1.8\」にインストールされます。

SS(あとで張る)

最後にインストールを開始するかどうかの確認があります。ここでも「Next >」をクリックしてください。

インストールが始まります。次のような画面になったら無事にインストール完了です。

SS(あとで張る)

ここでも「Close」をクリックしてウィンドウを閉じてください。

これでActiveScriptRubyのインストールは終了です。

アンインストール

アンインストール(ActiveScriptRubyをパソコンから削除する)の手順は次の通りです。

コントロールパネルからActiveScriptRubyを削除します。gemコマンド等で後から追加したライブラリファイルは自動的には削除されないようになっているので、すべてのファイルを完全に消したい場合はActiveScriptRubyをインストールしたディレクトリ(デフォルトではC:\Program Files\ruby-1.8)を削除してください。

動作確認

「スタート」→「すべてのプログラム」→「Ruby 1.8」→「ruby console」をクリックして「ruby console」を起動します。「ruby console」が起動すると、次のようなコマンドプロンプトが開きます。

SS(あとで張る)

コマンドプロンプトに次のように入力してください。

ruby -v

入力したら、Enterキーを押してください。「ruby -v」というのはRubyのバージョンを表示するコマンドです。ActiveScriptRubyがインストールされていれば、次のように表示されます。

SS(あとで張る)

次の文字がRubyのバージョンを表しています。

ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]

これで動作確認は終了です。

作業フォルダの準備

Rubyを動かすためにはRubyスクリプトが書かれたソースファイルが必要です。まずはソースファイルを置くための作業フォルダを準備しましょう。

Cドライブにworkという名前のフォルダを作成します(ここではCドライブにworkというフォルダを作成しますが、フォルダの場所や名前は違ってもかまいません)。

SS(あとで張る:エクスプローラでC:\workを開いているところ)

次に「ruby console」のショートカットをworkフォルダにコピーします。以下の手順でショートカットを用意しておくと、簡単に作業フォルダにあるソースファイルを実行できるようになります。

「スタート」→「すべてのプログラム」→「Ruby 1.8」にある「ruby console」を右クリックしてから「コピー」を選択し、workフォルダの中に貼り付けてください。

SS(あとで張る:エクスプローラでC:\workを開いているところ。コピー済み)

workディレクトリにある次にコピーした「ruby console」のプロパティを開いてください(右クリックして「プロパティ(R)」を選択する)。

SS(あとで張る:ruby consoleのプロパティ)

「作業フォルダ(S)」欄を空欄にして「OK」を押してください。

SS(あとで張る:ruby consoleのプロパティ:空欄にしたところ)

もう一度「ruby console」のプロパティを開いて確認してください。上の写真のように「作業フォルダ(S)」欄が空欄になっていればOKです。

作業フォルダにコピーした「ruby console」を起動してみましょう。

SS(あとで張る:コマンドプロンプト:)

最後に「C:\work>」と表示されていればOKです。これで作業フォルダの準備が整いました。

ソースファイルを作成する

次にエディタを使って、次のように書かれたテキストファイルを作成してください。

hello.rb

puts "Hello, World"

SS(あとで張る:上記ソースを打ち込んだエディタの画面)

ファイルの名前はhello.rbとし、作業フォルダ(C:\work)に保存してください。

SS(あとで張る:エクスプローラでC:\workを開いているところ:hello.rbがある)

ソースファイルhello.rbが準備できたら、作業フォルダにある「ruby console」を起動してください。コマンドプロンプトが起動したら次のように入力してEnterキーを押してください。

ruby hello.rb

ソースファイルが正しく書かれていれば次のように表示されるはずです。

SS(あとで張る:Hello, World)

コマンドプロンプトに表示された「Hello, World」は、今実行したRubyプログラムが出力したものです。