« RailsでWikiクローンを作る | メイン | Wiki新設 »

2005年08月26日

RailsでWikiクローンを作る 3: generateによる生成

モデルの作成
では、いよいよアプリケーションのコードを作っていきます。 最初はモデルを作成します。 Railsでモデル、ビュー、コントローラのコードを書くには、おおまかに以下の二つの方法があります。
  1. 全部手で書く
  2. ユーティリティスクリプト 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
のようになります。

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 にアクセスします。

wiki#show

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

投稿者 tam : 2005年08月26日 09:20

トラックバック

このエントリーのトラックバックURL:
http://tam.qmix.org/mt3/mt-tb.cgi/10

このリストは、次のエントリーを参照しています: RailsでWikiクローンを作る 3: generateによる生成:

» asian bubble bath lesbians from asian bubble bath lesbians
[続きを読む]

トラックバック時刻: 2007年04月22日 10:55

» the best free cartoon porn from the best free cartoon porn
[続きを読む]

トラックバック時刻: 2007年04月24日 23:50

コメント

コメントしてください




保存しますか?