URLの基本形
Ruby on Railsの重要な特徴の1つが、URLの形式です。次のURLをご覧ください。
http://www.example.com/show_product.cgi?product_id=123
これは典型的なCGIプログラムのURLの例です。ブラウザがこのURLに対してリクエストすると、Webサーバはあるディレクトリの下にあるshow_product.cgiというプログラムを起動します。
Railsでは、次のようになります。
http://www.example.com/products/show/123
これがRails式のURLの基本形です。URLのパス部分(/products/show/123)に注目してください。スラッシュ(/)で3つの部分に区切られており、それぞれに特別な意味が与えられています。
Railsアプリケーションはそれ自体がWebサーバとして動作しています。ブラウザからこのURLに対するリクエストを受けると、URLからコントローラとアクションを決定します。Railsアプリケーションを「機械」に例えると、コントローラは「部品」に、アクションは部品の「機能」に相当します。アプリケーションは、アクションを指定してコントローラにIDすなわち「信号」を送ります。そして、コントローラは様々な処理を経て、HTML文書を生成し、ブラウザに送り出します。
もちろん、実際の開発ではこのような単純な形式のURLだけで済むとは限りません。しかし、このURLの基本形をしっかり理解することが大切です。
コントローラとアクション
では、コントローラとアクションが実際にどのようなコードとして表現されるかを見ていきましょう。前回の記事で作成したプロジェクトapp1を引き続き使用します。
操作手順
1. NetBeansのプロジェクトウィンドウで[app1]→[コントローラ]の順にフォルダを展開します。
2. [products_controller.rb]を開き、次のように修正します。
class ProductsController < ApplicationController def index @products = Product.all end def show @product = Product.find(params[:id]) end end
3. [app1]フォルダを右クリックし、[実行]を選択します。
4. Webブラウザが起動して、「Welcome Aboard」のページが表示されたら、アドレスバーに「http://localhost:3000/products/show/123」と記入して[Enter]キーを押します。
5. 画面表示が次のように変わります。
解説
まず、ソースコード全体を取り囲むclass ... end
という構文に着目してください。これは、Ruby言語で「クラス」を定義する時の書き方です。
先ほど、アプリケーションを「機械」に例えたとき、コントローラは「部品」に当たると説明しました。この比喩を引き続き使用するならば、クラスは部品の「設計図」に相当します。Railsアプリケーションは、起動時にこの設計図を見てコントローラを実体化し、ブラウザからの要求を待ちます。
classの次にあるProductsControllerはコントローラクラスの名前です。Ruby言語では、クラス名は必ず大文字で始まることになっています。そして、Railsの規則により、コントローラクラスの名前は必ず「Controller」で終わらなければならず、コントローラの名前(products)と分離してはなりません。
クラス名の右にある記号「<」は、このクラスがApplicationControllerという別のクラスを「継承」していることを示しています。つまり、別の設計図の一部を取り込んでいる、ということです。
次に着目していただきたいのは、クラス定義の内側にあるdef ... end
という構文です。Ruby言語で「インスタンスメソッド」を定義するときはこのように記述します。
コントローラクラスのインスタンスメソッドは「アクション」と呼ばれます。今回の修正の結果、productsコントローラには、indexとshowという2つのアクションが定義されたわけです。
showアクションの中身はたった1行です。
@product = Product.find(params[:id])
Product.findという書き方については前回触れました。productsテーブルからユニークなIDでレコードを検索してくれるものです。括弧の中に指定されているparams[:id]
は、URLの末尾に指定されたidパラメータの値です。
私たちは「http://localhost:3000/products/show/123」というURLでアクセスしましたので、params[:id]
には"123"という文字列が格納されています。この結果、productsテーブルからIDが123であるようなレコードが検索されることになります。
さて、実際にWebブラウザでこのURLにアクセスしてみると、エラー画面が表示されてしまいました。これは仕方がありません。データベースのproductsテーブルにはidが123であるようなレコードは格納されていないのです。しかし、とりあえず、showというアクション(インスタンスメソッド)が反応していることは確認できました。