本文へジャンプ

検索範囲 検索

出発進行! Rails 3 の紹介

Martin Streicher, Software Developer, Pixel, Byte, and Comma
author photo - martin streicher
Martin Streicher はフリーランスの Ruby on Rails 開発者であり、以前は Linux Magazine の編集責任者でした。彼は Purdue University でコンピューター・サイエンスの修士号を取得しており、1986年以来 UNIX ライクなシステムのプログラミングをしてきました。彼は美術品やおもちゃを収集しています。

概要: リリースが間近に迫った Ruby on Rails バージョン 3 では、この人気の高い Ruby on Rails Web アプリケーション・フレームワークの機能を拡張するとともに、このフレームワークをより洗練されたものにしています。Rails 3 ではコントローラーが整理され、また SQL クエリーも実用的になったため、作成するコード量は従来よりも少なくなります。さらに良いことに、Rails 3 のコンポーネントの大部分を任意の Ruby アプリケーションに含めることができます。この記事では、Rails 3 で改善された部分について紹介します。

日付:  2010年 3月 23日
レベル:  中級 この記事の原文:  英語
アクティビティー: 4908 ビュー
お気軽にご意見・ご感想をお寄せください: 

この 2 年間、Ruby on Rails アプリケーション・フレームワークでは、いくつものホスティング・プロバイダーやサービス・プロバイダー、拡張を続ける膨大な開発ツール群、そしてソフトウェアの機能を高める多種多様な補助ライブラリー (Ruby では gem やプラグインと呼ばれます) を蓄積してきました。例えば Engine Yard と Heroku は、優れた仮想的な Rails ソフトウェアのホスティングを提供する会社です。風変わりな名前の Oink と Bullet は、それぞれメモリーの使用状況、パフォーマンスをプロファイリングするツールです。そして Clearance と Sunspot は、それぞれ認証機能、索引付けされた高速な検索機能をそのまま使える状態で提供するプラグインです。

よく使われる頭字語

  • CRUD: Create, Read, Update, Delete
  • HTML: HyperText Markup Language
  • REST: Representational State Transfer
  • SQL: Structured Query Language

2007年以来、Rails ではコミュニティーも大きくなりました。全世界の Rails 開発者達は活気に満ちており、互いに助け合い、常にソフトウェアの改善に意欲的に取り組んでいます。実際、Rails コミュニティーでは Rails を改善しようとしており、プログラマー達はより良いコードを作成するために常に切磋琢磨しあっている、と言っても決して誇張ではありません。繰り返しが行われるごとに、さまざまな機能が生まれたと思うと実用的なものになり、実用的なものから強力なもの、さらには洗練されたものになり、最終的には不可欠なものになります。多くの場合、Rails コミュニティーが不可欠と見なした gem やプラグインは Rails コアの中に収められます。Rails の named scope (クエリーの簡潔な表現) は、まさにその一例であり、nested form も同様です (nested form はごく最近追加された機能であり、同じ HTML フォーム内で複数のモデルを作成、編集しようとする従来の試みに代わるものです)。実際、Rails 開発者にとって最も困難な課題は、Rails の変化に追いつくことです。(幸いなことに、Ruby や Ruby on Rails に関して毎週更新されるポッドキャストがいくつかあり、その中でトレンドやベスト・プラクティスが整理されて紹介されています。)

Rails の次期メジャー・リリースである Rails バージョン 3 でも、ツールキットは急速な進化を続けています。そして Rails の伝統に従い、相変わらず「頑固に」設定よりも規約を優先しています。Rails のコア・コンポーネント、つまり RESTful な経路、関係、検証、テンプレート、データベース抽象化などは、従来のまま維持されています。しかし、こうしたユニットの内部では、その大部分が再作成されたり、あるいは改善されたりしています。最も注目すべき点として、Rails 3 では Merb のさまざまな技術を大量に採用しているため、Rails の基本機能の多くは、もはや密結合されてはいません。例えば、従来は Rails アプリケーションでしか利用できなかった便利なデータ検証機能は、今や独立したコンポーネントであり、まったく普通の Ruby コードに含めることができます。パーシャルやテンプレートの描画といったコントローラー機能も今や独立した機能であり、任意のライブラリーに組み込むことができます。

この記事では、Rails 3 について、そして Rails 3 での多くの変更と追加について調べ、新しい Rails 3 アプリケーションをゼロの状態から作成します。2010年 2月半ばの時点で、Rails 3 はベータ・プレリリースの状態にあり、夏が始まる前の正式リリースに向け、中心となるチームはパッチやフィードバック、ドキュメントを収集している最中です。しかし現時点での Rails 3 でも、アプリケーションを作成したり、多くの新機能について学んだりするには十分です。

大きな変更と小さな変更

Rails 3 での変更はあまりにも数が多く、ここで完全に説明することはできません。補助資料を含めた変更の完全なリストを読むためには、Rails 3 のリリース・ノートを参照してください (「参考文献」にリンクがあります)。ただしここで、ほぼ確実に開発者に影響すると思われる変更点をいくつか挙げておきます。

  • すべてを 1 つのコマンドで制御。Rails 3 では、これまで各アプリケーションの中にあった一連のスクリプト (script/server や script/generate など) はなくなり、rails という適切な名前が付いた 1 つのコマンドで置き換えられています。例えば、従来は ./script/console と入力していたものは、今度は rails console と入力します。また rails コマンドによって、従来と同じように新しいアプリケーションを生成することもできます。rails コマンドの動作は既存の Rails アプリケーションの中で起動されたかどうかによって異なります。
  • 依存関係をマニフェストで解決。gem の依存関係の調整と解決は面倒な問題です。gem のリビジョンはシステムごとに異なり、どんな gem を利用できるのかもシステムごとに異なります。このようにシステムごとに異なる多様な依存関係があると、Rails アプリケーションを広範にデプロイしたり共有したりすることが難しくなります。Rails 3 では、依存関係を管理するための特別なユーティリティーである、Bundler を導入しています (その結果 config.gem は古いものになりました)。依存関係の宣言はアプリケーションのルートにある Gemfile というカタログの中で行います。Bundler は指定された gem をすべてダウンロードして保存します。さらにはアプリケーションの中に gem を含めてしまうことで、外部リポジトリーからのダウンロードを不要にすることもできます。
  • クエリーを使わないクエリー。Rails は古くからドメイン特化言語 (DSL) を多用してきました (has_onevalidates_numericality_of を考えてみてください)。ただし 1 つ重要な例外があり、それがデータベース・クエリーです。Rails の動的ファインダーのおかげで負担が軽くなることは確かですが、find_by_sql 文の場合と同様で、通常 :conditions:order:limit などが多用されたオプションのハッシュによってコードが複雑になりがちです。Rails 3 には、クエリーを表現するための DSL である関係代数が採用されています。プリミティブには、(列を選択するための) project、(条件を表現するための) where、(関係を指定するための) join、(それぞれ限界とオフセットを指定するための) takeskip、(集約のための) group、などがあります。
  • ボイラープレート・コード不要のコントローラー。Rails コントローラーのコア・アクション (newcreateeditupdate) は通常は変化せず、特にコントローラーの主目的が CRUD 操作用の場合には変化しません。実際、コントローラー生成命令 ./script/generate controller の出力で十分な場合がほとんどであり、生成されたものを特に変更する必要はありません。このようにコントローラーはどれも似ていることから、Rails 3 では Responder を導入し、さらにコードを単純化しています。例えば、create アクションに必要なコードは下記のように数行にすぎません。
      class PostsController
        respond_to :html, :xml
    
        def create
          @post = Post.create(params[:post])
          respond_with(@post)
        end
      end
    

    このスニペットでは、@post が適切に保存された場合には respond_with(@post)show にルーティングされて新しいレコードを表示し、このオブジェクトの検証が失敗した場合には respond_with(@post) は new にルーティングされます。

繰り返しますが、これはごく一部の例にすぎません。次のセクションでは、これらの新機能や他の機能の例について説明し、Rails 3 のアプリケーションをゼロの状態から作成します。


初めての Rails 3 アプリケーション

お使いのシステムで Rails 3 を実行するために必要なものは、Ruby バージョン 1.8.7 または Ruby バージョン 1.9.2、あるいはまたはそれよりも新しいリリースの Ruby 言語と付属ライブラリー、そしてインタープリターです。また、マシンに Git ソフトウェア・バージョン管理システムがインストールされていると役立ちます。Rails 3 や、その他多くの重要な Rails プロジェクトは Git によって維持管理されているからです。またシステムにはデータベース・エンジンも必要です (SQLite (バージョン 3)、MySQL、PostgreSQL など)。Rails アプリケーションの作成には Web サーバーは必要ありませんが、通常は本番デプロイメントの一部として Web サーバーがあるものです。

Rails 3 アプリケーションを作成するためには、Rails 3 プレリリースの gem と、その gem の依存関係のすべてが必要です。今のところ、いくつかのコマンドを使うだけで必要なコンポーネントをインストールすることができます (リスト 1)。(コマンドを実行する前に Rails 3 のドキュメントを調べてください。詳細部分はリリースごとに異なる可能性があります。)


リスト 1. Rails 3 プレリリースの gem と依存関係

$ gem install rails3b
Due to a rubygems bug, you must uninstall all older versions of bundler for 0.9 to work
Successfully installed mime-types-1.16
Successfully installed mail-2.1.2
Successfully installed text-hyphen-1.0.0
Successfully installed text-format-1.0.0
Successfully installed memcache-client-1.7.8
Successfully installed rack-1.1.0
Successfully installed rack-mount-0.4.7
Successfully installed abstract-1.0.0
Successfully installed erubis-2.6.5
Successfully installed i18n-0.3.3
Successfully installed tzinfo-0.3.16
Successfully installed bundler-0.9.5
Successfully installed thor-0.13.1
Successfully installed rails3b-3.0.1
14 gems installed

$ gem install arel --pre
Successfully installed activesupport-3.0.0.beta
Successfully installed arel-0.2.pre
2 gems installed

$ gem install rails --pre
Successfully installed activemodel-3.0.0.beta
Successfully installed actionpack-3.0.0.beta
Successfully installed activerecord-3.0.0.beta
Successfully installed activeresource-3.0.0.beta
Successfully installed actionmailer-3.0.0.beta
Successfully installed railties-3.0.0.beta
Successfully installed rails-3.0.0.beta
7 gems installed

次のステップは、単純なウィキのアプリケーションを生成することです (リスト 2)。このアプリケーションは記事の作成と管理を行います。各記事にはタイトルと文章があり、新しい記事を作成するためには単にその記事への参照を既存のページの本体から作成します。参照は、ラクダ記法による任意の単語、例えば TheSolarSystem や TheOscars などによって行われます。

注: このウィキ・アプリケーションのソース・コードは下記の「ダウンロード」テーブルから入手することができます。


リスト 2. Rails のウィキ・アプリケーション

$ rails wiki

ls -lR を実行してアプリケーションを構成するファイルを表示すると、下記のようないくつかの新しいファイルがあることがわかります。

  • Gemfile は先ほど触れた gem のマニフェストです。このファイルには少なくとも 2 つの行が含まれている必要があります (Rails 3 のベータ版 gem のソースを指す行と、Rails 3 のベータ版 gem 自体を含めるための行)。通常は次のように、(少なくとも) 3 番目の行としてデータベースに接続するための行が必要なはずです。

    source 'http://gemcutter.org'
    gem "rails", "3.0.0.beta"
    gem "sqlite3-ruby", :require => "sqlite3"
    

  • config/application.rb の中には、従来 config/environment.rb の中にあった多くのオプションが含まれています。config/environment.rb は残っていますが、その内容のほとんどは非推奨となっています。config/application.rb に追加された重要なものの 1 つが generators ブロックです。

    config.generators do |g|
      g.orm             :active_record
      g.template_engine :erb
      g.test_framework  :test_unit, :fixture => true
    end
    

    Rails 3 アプリケーションは、これらと互換性のある、いくつかの ORM (Object-Relational Mapper)、テンプレート・エンジン、テスト・フレームワークの 1 つを使用します。generators ブロックはアプリケーションのプリファレンスを指定し、モデルやビューなどのための適切な生成コマンドを呼び出します。

  • db/seeds.rb は Rails 3 で新たに追加されたファイルではありませんが、ごく最近追加されたものであり (Rails バージョン 2.3.4 で導入されました)、重要なので説明しておきます。アプリケーションを適切に実行するために初期データ (例えば管理ユーザー、価格コード、静的ページなど) が必要な場合には、それらのデータを db/seeds.rb の中に作成し、rake db:seed を実行します。このシード・ファイルが導入される前には初期化のための規約がなく、多くの開発者はコードを移植して使用していたため、データベースの作成とデータベースへのデータ追加との区別が曖昧になっていました。
  • 各 Rails 3 アプリケーションのルートにある config.ru は、いわゆる rackup ファイル、つまり Rack ベースのアプリケーションのための構成です。Rails 3 は Rack アプリケーションであり、同じく Rack をサポートする任意の Web サーバーと互換性があります。一般的に、他の Rack コンポーネントを追加する必要がある場合を除き、config.ru に触れる必要はありません。

これら以外にも新しいファイルがいくつかありますが、その大部分は Rails バージョン 2.3 からお馴染みのもののように見えるはずです。config/routes.rb ファイルの用途は以前と同じですが、大幅に単純化され、Ruby らしさが増しています。この例を、このすぐ後に説明します。

アプリケーションを生成し、Gemfile を編集して依存関係を取り込んだら、次のステップはアプリケーションに必要な gem を収集することです。それを行うものが、新しいユーティリティーである bundle です (リスト 3)。


リスト 3. 必要な gem を収集する

$ bundle
installFetching source index from http://gemcutter.org
Resolving dependencies
Installing abstract (1.0.0) from system gems
Installing actionmailer (3.0.0.beta) from system gems
Installing actionpack (3.0.0.beta) from system gems
Installing activemodel (3.0.0.beta) from system gems
Installing activerecord (3.0.0.beta) from system gems
Installing activeresource (3.0.0.beta) from system gems
Installing activesupport (3.0.0.beta) from system gems
Installing arel (0.2.1) from rubygems repository at http://gemcutter.org
Installing builder (2.1.2) from system gems
Installing bundler (0.9.7) from rubygems repository at http://gemcutter.org
Installing erubis (2.6.5) from system gems
Installing i18n (0.3.3) from system gems
Installing mail (2.1.2) from system gems
Installing memcache-client (1.7.8) from system gems
Installing mime-types (1.16) from system gems
Installing rack (1.1.0) from system gems
Installing rack-mount (0.4.7) from system gems
Installing rack-test (0.5.3) from system gems
Installing rails (3.0.0.beta) from system gems
Installing railties (3.0.0.beta) from system gems
Installing rake (0.8.7) from system gems
Installing sqlite3-ruby (1.2.5) from rubygems repository at
    http://gemcutter.org with native extensions
Installing text-format (1.0.0) from system gems
Installing text-hyphen (1.0.0) from system gems
Installing thor (0.13.3) from rubygems repository at http://gemcutter.org
Installing tzinfo (0.3.16) from system gems
Your bundle is complete!

bundle ユーティリティーは Bundler の省略形であり、Gemfile で指定されたすべての gem と、それらの gem の前提条件のすべてをダウンロードしてインストールします (リスト 4)。また bundle ユーティリティーは、これらの依存関係のすべてをアプリケーションの中にコピーし、コード・ベースを自己完結的なものにします。具体的に言えば、bundle pack を実行すると、Bundler は一連の gem を vendor/cache にコピーします。


リスト 4. bundle ユーティリティーを実行する

$ bundle pack
Copying .gem files into vendor/cache
  * bundler-0.9.7.gem
  * thor-0.13.3.gem
  * abstract-1.0.0.gem
  * mime-types-1.16.gem
  * text-hyphen-1.0.0.gem
  * rack-mount-0.4.7.gem
  * rake-0.8.7.gem
  * text-format-1.0.0.gem
  * tzinfo-0.3.16.gem
  * rack-test-0.5.3.gem
  * builder-2.1.2.gem
  * erubis-2.6.5.gem
  * memcache-client-1.7.8.gem
  * rack-1.1.0.gem
  * sqlite3-ruby-1.2.5.gem
  * i18n-0.3.3.gem
  * activesupport-3.0.0.beta.gem
  * arel-0.2.1.gem
  * mail-2.1.2.gem
  * activemodel-3.0.0.beta.gem
  * activerecord-3.0.0.beta.gem
  * actionpack-3.0.0.beta.gem
  * railties-3.0.0.beta.gem
  * actionmailer-3.0.0.beta.gem
  * activeresource-3.0.0.beta.gem
  * rails-3.0.0.beta.gem

$ ls vendor/cache
abstract-1.0.0.gem		memcache-client-1.7.8.gem
actionmailer-3.0.0.beta.gem	mime-types-1.16.gem
actionpack-3.0.0.beta.gem	rack-1.1.0.gem
activemodel-3.0.0.beta.gem	rack-mount-0.4.7.gem
activerecord-3.0.0.beta.gem	rack-test-0.5.3.gem
activeresource-3.0.0.beta.gem	rails-3.0.0.beta.gem
activesupport-3.0.0.beta.gem	railties-3.0.0.beta.gem
arel-0.2.1.gem			rake-0.8.7.gem
builder-2.1.2.gem		sqlite3-ruby-1.2.5.gem
bundler-0.9.7.gem		text-format-1.0.0.gem
erubis-2.6.5.gem		text-hyphen-1.0.0.gem
i18n-0.3.3.gem			thor-0.13.3.gem
mail-2.1.2.gem			tzinfo-0.3.16.gem

vendor/cache はアプリケーション独自の gem リポジトリーと考えることができます。このコード・ベースは任意の場所に移動することができ、その移動した場所で、アプリケーションが依存する gem ソフトウェアの多様なバージョンを利用することができ、リモートのリポジトリーは必要ありません。例えば bundle pack の後に bundle install を実行すると、gem はアプリケーションのリポジトリーからシステムにインストールされます (リスト 5)。


リスト 5. gem をインストールする

Fetching source index from http://gemcutter.org
Resolving dependencies
Installing abstract (1.0.0) from .gem files at
  /Users/strike/projects/rails3/wiki/vendor/cache
Installing actionmailer (3.0.0.beta) from .gem files at
  /Users/strike/projects/rails3/wiki/vendor/cache
Installing actionpack (3.0.0.beta) from .gem files at
  /Users/strike/projects/rails3/wiki/vendor/cache
...
Installing thor (0.13.3) from .gem files at
  /Users/strike/projects/rails3/wiki/vendor/cache
Installing tzinfo (0.3.16) from .gem files at
  /Users/strike/projects/rails3/wiki/vendor/cache
Your bundle is complete!


ウィキを扱う

アプリケーションを作成するためには、ページの scaffold を生成し、データベースを作成したら、そのデータベースに初期ページを追加し、必要な経路を設定します (リスト 6)。ここでは単純にするために、ウィキ・ページのレコードには数個のフィールドしかありません。つまりフィールドとしては、title、slug (title の省略形)、body、そしてページが作成された時と最後に変更された時を記録するための timestamps のみです。title と slug はストリング・フィールドです。body はテキスト・フィールドです。timestamps は日付フィールドと時刻フィールドです。(もちろん、実際のウィキには他にもフィールドがあるはずです。例えば、そのページの一番最近の作成者や以前のリビジョンなど。この例では単純にするために、ユーザーやセッション、フォーマット設定、さまざまな認証や承認なども省略しています。) 最初のモデル、一連のビュー、そしてコントローラーを、コマンド rails generate scaffold を使って生成します。


リスト 6. 完全なウィキ・アプリケーション

$ rails generate scaffold page title:string slug:string body:text --timestamps
      invoke  active_record
      create    db/migrate/20100221115613_create_pages.rb
      create    app/models/page.rb
      invoke    test_unit
      create      test/unit/page_test.rb
      create      test/fixtures/pages.yml
       route  resources :pages
      invoke  scaffold_controller
      create    app/controllers/pages_controller.rb
      invoke    erb
      create      app/views/pages
      create      app/views/pages/index.html.erb
      create      app/views/pages/edit.html.erb
      create      app/views/pages/show.html.erb
      create      app/views/pages/new.html.erb
      create      app/views/pages/_form.html.erb
      create      app/views/layouts/pages.html.erb
      invoke    test_unit
      create      test/functional/pages_controller_test.rb
      invoke    helper
      create      app/helpers/pages_helper.rb
      invoke      test_unit
      create        test/unit/helpers/pages_helper_test.rb
      invoke  stylesheets
      create    public/stylesheets/scaffold.css

./script/generate はどうなったのかと思う人がいるかもしれませんが、今や ./script/generate はあらゆる場面で使用できる rails コマンドに含まれていることを思い出してください。

rake db:create db:migrate を実行してデータベースを作成します。

$ rake db:create db:migrate
==  CreatePages: migrating ====================================================
-- create_table(:pages)
   -> 0.0010s
==  CreatePages: migrated (0.0011s) ===========================================

これでウィキが存在するようになりましたが、このウィキは空です。他のすべてのページのアンカーとなる最初のページを追加します。db/seeds.rb ファイルを編集し、新しいページを作成するためのコードを作成します (リスト 7)。


リスト 7. ウィキのアンカー・ページ

Page.create(
  :title    => 'The Marx Brothers Wiki',
  :slug     => 'Home',
  :body     => 'An encyclopedic guide to the Marx Brothers.')

rake db:seed と入力することで、このコードを実行します。rails console と入力すると、このページをパッと見ただけで素早く検証することができます (リスト 8)。


リスト 8. アンカー・ページを検証する

$ rake db:seed
(in /Users/strike/projects/rails3/wiki)

$ rails console
Loading development environment (Rails 3.0.0.beta)
irb(main):001:0> Page.all
=> [#<Page id: 1, title: "The Marx Brothers Wiki", slug: "Home",
    body: "An encyclopedic guide to the Marx Brothers.",
    created_at: "2010-02-21 12:24:43", updated_at: "2010-02-21 12:24:43">]

このコードについて説明する前に、経路を設定します。経路は 2 つ必要です。つまりホームページを見つけるためのデフォルトの経路、そしてページの slug によってページを見つけるための別の経路という 2 つです。リスト 9 は最終的な config/routes.rb ファイルを示しています。


リスト 9. config/routes.rb (最終版)

Wiki::Application.routes.draw do |map|
  resources :pages
  root :to => "pages#show"
end

リスト 6rails generate scaffold page 行によって 2 行目の経路が自動的に作成されており、この経路は RESTful です。3 行目に手動で経路を追加する必要があります。サイトの経路のデフォルトの「ルート (root)」を指定するための構文は Rails 3 で新たに登場したものです。3 行目の内容は、『経路「/」を pages コントローラーの「show」メソッドにマッピングする』ということです。show メソッドのコードにより、データベースの中にあるホームページが発見されて、表示されます。

新しいルート経路を追加したら、public/index.html ファイルを削除し、競合を防止します。

$ rm public/index.html

今度はページ・コントローラーに注目します。Rails 3 でのページ・コントローラーのコードは極めて簡潔です。リスト 10 はページ・コントローラーの最初の実装であり、show メソッドしかありません。


リスト 10. Rails 3 のコントローラー

class PagesController < ApplicationController
  respond_to :html

  def show
    @page = Page.where( :slug => ( params[:id] || 'Home' ) ).first
    respond_with( @page )
  end
end

これを見るとわかるように、Rails 2 のコントローラーに通常見られたボイラープレート・コードはまったくありません。respond_to はコントローラーがサポートするフォーマットを一覧表示します。ここではコントローラーは HTML に対するリクエストにのみ応答します。respond_with はコントローラーによる処理の進め方を指定するためのロジックの省略形です。

クエリーのための構文も非常に異なっています。この参照は Rails 3 の関係代数の一例です。なぜ first という接尾辞が必要なのかと思う人がいるかもしれません。where など、クエリーを表現するオペランドによって実際にクエリーが実行されることはありません。データが実際に必要になるまで、クエリーはそのまま放置されます。これは遅延ローディング、つまり可能な限りクエリーを遅延させる手法です。first によってデータベースへの問い合わせが実際にトリガーされます。

このアプリケーションを今実行すると、図 1 のようなものが表示されるはずです。


図 1. Rails 3 のウィキ・アプリケーション
次のテキストが表示されたページのスクリーン・ショット。Title として The Marx Brothers wiki、Slug として Home、Body として An encyclopedic guide to the Marx Brothers が表示されています。ページの下の方に「Edit」と「Back」のためのリンクがあります。

ここで、コントローラーにコードを追加します。リスト 11 は完全なコントローラーを示しています。


リスト 11. 完全な Rails 3 コントローラー

class PagesController < ApplicationController
  respond_to :html
  before_filter :get_page, :except => [ :create ]

  def create
    respond_with( @page = Page.create( params[ :page ] ) )
  end

  def edit
  end

  def index
    render :action => :show
  end

  def show
    @page ||= Page.new( :slug => params[ :id ] )

    if @page.new_record?
      render :action => :new
    else
      respond_with( @page )
    end
  end

  def update
    @page.update_attributes( params[ :page ] )
    respond_with( @page )
  end

  private

    def get_page
      @page = Page.where( :slug => ( params[:id] || 'Home' ) ).first ||
        Page.where( :id => params[:id] ).first
    end
end

コントローラーの中で、index メソッドは show アクションを反映しているにすぎず、ページ識別子を持っていません。従ってホームページを描画します。show は指定された ID または slug のページを表示します (すべてのアクションに関する参照は get_page に集められているため、さらにコード量が削減されています)。ページが存在しない場合には、新しいページが編集用に用意されます。

Page モデルは単にすべてのフィールドが存在しているかどうかを検証します。

class Page > ActiveRecord::Base
  validates_presence_of :body, :slug, :title
end

ラクダ記法の参照を他のページへのリンクに変換する動作は Page モデルのビューの中で行われます。app/helpers/pages_helper.rb のヘルパー関数が大部分の作業を行うため、ビューには最低限のコードしかありません (リスト 12)。


リスト 12. ラクダ記法を変換するヘルパー関数

module PagesHelper
  def wikify( page )
    return '' if page.body.blank?
    page.body.gsub( /^([A-Z][[:alnum:]]*([A-Z][[:alnum:]]*)+)/ ) do |match|
      link_to( $1, :action => :show, :id => $1 )
    end
  end
end

このビューは典型的なものです (リスト 13)。


リスト 13. 典型的なビュー

<p>
  <b>Title:</b>
  <%= @page.title %>
</p>

<p>
  <b>Body:</b>
  <%= raw wikify( @page ) %>
</p>

<%= link_to 'Edit', edit_page_path(@page) %> |
<%= link_to 'Back', pages_path %>

raw 演算子は Rails 3 で新たに登場したものです。従来の Rails リリースとは逆に、すべてのストリングはデフォルトで HTML なしに安全に出力されます。HTML でストリングを出力したい場合には、raw を使う必要があります。


Rails を切り換える

この記事で紹介した改善事項や便利さに加え、Rails 3 は従来のバージョンよりもパフォーマンスが改善されており、特にパーシャルの描画のパフォーマンスが改善されています。また独自のバリデーター・クラスを作成することができ、より効率化された標準的な検証も利用できるようになっています。例えば下記の検証は Jeremy McAnally によって作成されたものですが、この検証を行うために以前は別々の 4 行のコードが必要でした。

validates :login, :presence => true, :length => {:minimum => 4},
  :uniqueness => true, :format => { :with => /[A-Za-z0-9]+/ }

Rails の正式なチュートリアルである Rails Guides は、現在 Rails 3 に対応するように更新が行われています。また、Jeremy McAnally、Yehuda Katz、Gregg Pollack、その他コミュニティーのリーダーによるブログには、広範な内容を網羅した説明や賢明なソリューションが紹介されています (「参考文献」を参照)。また人気のある何冊かの本も新しいリリースに対応して改訂が行われている最中であり、その中にはツルハシの表紙で有名な『Programming Ruby』や、『Agile Web Development with Rails』(「参考文献」) も含まれています。



ダウンロード

内容ファイル名サイズダウンロード形式
Source files for the example wikiwiki.zip120KBHTTP

ダウンロード形式について


参考文献

学ぶために

  • Rails 3 のリリース・ノート: このリリース・ノートには、Rails 3 のコードへの追加事項や改善事項、変更点などに関する包括的で最新の内容が、一覧で説明されています。

  • Merb: Rails 3 は Merb フレームワークの機能の多くを統合しています。Merb の歴史と機能について知ってください。

  • Jeremy McAnally のブログ: このブログはチュートリアルであり、エキスパートによる洞察でもあります。

  • Yehuda Katz のブログ: Katz は Rails の中心的コントリビューターであり、Merb と Rails の統合に関するチーフ・アーキテクトでもあります。

  • Gregg Pollack のブログ: Pollack は、Rails に関して毎週更新されるポッドキャスト、そして時折行われるスクリーンキャストをホストしています。

  • RailsによるアジャイルWebアプリケーション開発』(Sam Ruby、Dave Thomas、David Heinemeier Hansson らの共著、2009 年オーム社刊): この本は Rails を学ぼうとする人にとって計りしれないほど貴重な本です。

  • developerWorks の Web development ゾーン: Web development ゾーンには Web 2.0 開発に関するツールや情報が豊富に用意されています。

  • IBM Technical events and webcasts: developerWorks の Technical events and webcasts で最新情報を入手してください。

製品や技術を入手するために

  • Ruby on Rails: Rails のホームページを訪れ、Rails について詳細資料を読み、また Rails をダウンロードしてください。

  • Sunspot: Rails 用のテキスト検索プラグイン、Sunspot のコピーを Github からダウンロードしてください。

  • Clearance: このパッケージ化された Rails ソリューションはユーザー認証に役立ちます。

  • Bullet: アプリケーションに Bullet を組み込み、実行が極めて遅延されたクエリーや、即座に実行されるクエリーを発見してください。

  • Oink: Rails アプリケーションのメモリー使用量を減らすために、この風変わりな名前の Oink を試してください。

  • IBM 製品の試用版: これらの試用版をダウンロードし、DB2® や Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品をお試しください。

議論するために

著者について

author photo - martin streicher

Martin Streicher はフリーランスの Ruby on Rails 開発者であり、以前は Linux Magazine の編集責任者でした。彼は Purdue University でコンピューター・サイエンスの修士号を取得しており、1986年以来 UNIX ライクなシステムのプログラミングをしてきました。彼は美術品やおもちゃを収集しています。

このページを共有する


コメント



商標  |  My developerWorks ご利用条件

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development
ArticleID=483228
ArticleTitle=出発進行! Rails 3 の紹介
publish-date=03232010
author1-email=martin.streicher@gmail.com
author1-email-cc=

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。