RailsでWikiクローンを作る02
generateによる生成
モデルの作成
では、いよいよアプリケーションのコードを作っていきます。最初はモデルを作成します。 Railsでモデル、ビュー、コントローラのコードを書くには、おおまかに以下の二つの方法があります。
- 全部手で書く
- ユーティリティスクリプト script/generateコマンドを使って雛形を生成し、それを手で修正していく
大抵の場合は 2番目の方法でやるのが楽です。特に、Rails のチュートリアル では必ず触れられている scaffold の機能を使うと、あっと言う間にデータベー スをいじれるアプリケーションができてしまいます。しかし scaffold は魔法 の度合いが高すぎるので、ここでは敢えて使いません(どうせほとんど書き直 すし)。モデルジェネレータでモデルの雛形だけ生成します。
% ruby script/generate model Page
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/page.rb
create test/unit/page_test.rb
create test/fixtures/pages.yml
script/generate はジェネレータ起動スクリプトで、この例ではモデルジェネ レータを起動しています。引数としてモデルのクラス名(ここではPage)を指定 します。
出力内容の create の行に注目してください。app/models の下に page.rb と いうモデルのプログラムが自動生成されています。同時にテスト用コードも生 成されています。
テストコードはとりあえず置いておいて、app/models/page.rb の中身を見て みましょう。
% cat app/models/page.rb class Page < ActiveRecord::Base end
たったこれだけ。これは自動生成された雛形なので空っぽに近い状態ですが、 これだけである程度ちゃんと動いてしまいます。これは Rails の大きな特徴 の一つで、細かい設定を書かなくても、命名規則を決めることによってある程 度決めうちルールで動くようになっているのです。
ActiveRecordでは、データベースのテーブルとRubyのクラスが一対一で対応し ます。 そして命名規則によって、クラス名(この場合は Page)を決めると、ク ラス定義を格納するファイル名(app/models/page.rb)、データベースのテーブ ル名(pages)が自動的に決まります。 また ActiveRecord は、テーブルのカラ ム情報を読み込んで動的に必要なメソッドを追加します。テーブルにカラムを 追加しても Ruby のクラスの内容は変更する必要がありません。
そのため、上記のように単にクラス名を決めて ActiveRecord::Baseを継承し たクラスをつくるだけで、Page.find でテーブル検索したり、Page#title や Page#freezeflag などのメソッドによって要素にアクセスができるようになり ます。
コントローラとビューの作成
次はコントローラとビューを作ります。これもジェネレータで生成します。 Railsではコントローラとビューは、script/generate controller で同時に生 成されます。そのため、script/generate view はありません。
Minkiでは、wiki画面の表示・編集等を行う wiki コントローラと、管理画面 の admin コントローラの二つを作成することにします。ただ、adminコントロー ラは後回しにして、まずはwikiコントローラのみを作ります。 wikiコントロー ラに必要なアクションは何でしょうか? とりあえず、new(ページ新規作成)、 show(ページ表示)、edit(ページ編集)、list(ページ一覧表示)くらいあれば良 いと思うので、この四つを作ります。
% ruby script/generate controller Wiki new show edit list
exists app/controllers/
exists app/helpers/
create app/views/wiki
exists test/functional/
create app/controllers/wiki_controller.rb
create test/functional/wiki_controller_test.rb
create app/helpers/wiki_helper.rb
create app/views/wiki/new.rhtml
create app/views/wiki/show.rhtml
create app/views/wiki/edit.rhtml
create app/views/wiki/list.rhtml
ruby script/generate controller がコントローラ(とビュー)のジェネレータ です。その次の引数の Wiki はコントローラのクラス名です。勝手に Controller という文字がついて、実際のコントローラクラス名は WikiController になります(生成されるファイルは app/controllers/wiki_controller.rb)。 Wikiの後ろに続く引数はアクション 名を列挙したもので、アクションに対応するビューも同時に作られます(ビュー のテンプレートは app/views/wiki/○○.rhtml)。
生成された雛形のファイルの中身は、以下のようになっています。
% cat app/controllers/wiki_controller.rb class WikiController < ApplicationController def new end def show end def edit end def list end end
WikiController クラスは ApplicationController クラスを継承して定義され ています。そしてメソッドとして各アクションが定義されていますが中身は空 です。
ApplicationController は、「UTF-8で運用する」の部分でもでてきましたが、 app/controllers/application.rb というファイルで定義されています。すべ てのコントローラは、この ApplicationController のサブクラスになります ので、共通なメソッドや属性等は ApplicationController で定義すると楽で す。
ビューの方は、対応するコントローラとアクションに応じて、app/views/コン トローラ名(小文字)/アクション名.rhtml というテンプレートファイルができ ます。例えば show.rhtml を見てみます。ほかのテンプレートもほとんど同じ です。
% cat app/views/wiki/show.rhtml <h1>Wiki#show</h1> <p>Find me in app/views/wiki/show.rhtml</p>
では、実際にアクセスしてどのような画面がでるのか確認しましょう。 webサー バが起動していなかったら ruby script/server として起動します。
コントローラ名が wiki、アクション名が show の場合、それを呼び出す URL のパスの部分は /wiki/show になるので、アクセスする URL は
http://localhost:3000/wiki/show
のようになります。

上記のテンプレートの内容がそのまま出ているだけというのがわかります。前 に MVC の説明のところで、Rails では /wiki/show/FrontPage のようにして ID を指定できると書きました。しかし現時点では、IDに関しては何の処理も していないので、
http://localhost:3000/wiki/show/FrontPage
のようにIDを付けてアクセスしても、上記の http://localhost:3000/wiki/show の場合と何も変わりません。
これだけではおもしろくないので、ちょっとコントローラとビューの動きを確 認するためにコードを書き換えてみます。 app/controllers/wiki_controller.rb の show メソッドを以下のように書き 換えます。
def show @id = params[:id] end
そして、ビューのテンプレート app/views/wiki/show.rhtml を次のように書き換えます(注: 文字コードは UTF-8 で保存してください)。
<h1>Wiki#show</h1> <p>IDは <%= @id %> です。</p>
そして再び http://localhost:3000/wiki/show/FrontPage にアクセスします。

「IDは FrontPage です。」というように ID が表示されるようになります(つ まらない例で申し訳ない)。ID部分を変えてみて結果も変わることを確認して みてください。
コントローラでは params という属性で各種パラメータを受け取れるようになっ ています。 params[:id] が、URL でアクション名の後ろに付く ID 名です。 show メソッドの中では、params[:id] を @id というインスタンス変数に格納 しています。
一方、ビューのテンプレートは ERB によって<%= @id %>の部分が置換され、 ID名、つまりこの例の場合は 'FrontPage' という文字列になります。このよ うに、コントローラのインスタンス変数はそのままビューで参照できるので、 コントローラからビューへの値の受け渡しはインスタンス変数で行います。

Keyword(s):
References:[RailsでWikiクローンを作る]