« RailsでWikiクローンを作る | メイン | Wiki新設 »
2005年08月26日
RailsでWikiクローンを作る 3: generateによる生成
モデルの作成
では、いよいよアプリケーションのコードを作っていきます。
最初はモデルを作成します。
Railsでモデル、ビュー、コントローラのコードを書くには、おおまかに以下の二つの方法があります。
- 全部手で書く
- ユーティリティスクリプト script/generateコマンドを使って雛形を生成し、それを手で修正していく
% 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 endWikiController クラスは 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のようになります。

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

コントローラでは 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