書籍転載:Ruby on Rails 4アプリケーションプログラミング
コントローラの基本
Railsプログラミングの基点は、MVCのControllerクラス。ここから具体的なコードを記述していこう。
書籍転載について
ご注意
本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどはBuild Insiderのそれとは一致しません。あらかじめご了承ください。
前回は「2.1 アプリケーションの作成」を説明しました。本稿はその続きです。Railsアプリケーションの作成方法については、第1回から順にお読みください。
■
2.2 コントローラの基本
Railsが正しく動作していることを確認できたら、いよいよ自分でも具体的なコードを記述してみましょう。
Railsプログラミングを行う上で、まず基点となるのはコントローラクラスです。コントローラクラスはModel - View - ControllerのうちControllerを担うコンポーネントで、個々のリクエストに応じた処理を行います。ビジネスロジック(Model)を呼び出すのも、その結果を出力(View)に引き渡すのも、コントローラクラスの役割です。コントローラクラスとは、リクエストの受信からレスポンスの送信までを一手に担う、Railsアプリケーションの中核とも言える存在です。
2.2.1 コントローラクラスの作成
プログラミング入門書の定番といえば、Hello, Worldアプリケーションです。まずは、「こんにちは、世界」というメッセージを表示するだけのサンプルを作成し、コントローラクラスの基本を理解しましょう。
コントローラクラスを作成するには、コマンドプロンプトからrails generateコマンドを実行します*6。
- *6 rails generateコマンドは、コントローラクラスだけでなく、モデルやテスト、アプリケーションの土台などを自動生成するためのコマンドです。今後もたびたび登場するので、きちんと覚えておいてください。ショートカットとして「rails g」でも代替できます。
【構文】rails generateコマンド(コントローラクラスの生成)
rails generate controller nam [options]
|
name: コントローラ名
options: 動作オプション
分類 | オプション | 概要 |
---|---|---|
基本*7 | -f、--force | ファイルが存在する場合に上書き |
-p, --pretend | 実際にはファイルを作成しない、試験的な実行(結果のみを表示) | |
-q、--quiet | 進捗状況を表示しない | |
-s、--skip | 同名のファイルが存在する場合はスキップ | |
コントローラ | --assets | アセットを生成するか(デフォルトはtrue) |
-e, [--template-engine=NAME ] | 使用するテンプレートエンジン(デフォルトはerb) | |
-t、--test-framework=NAME | 使用するテストフレームワーク(デフォルトはtest_unit) | |
--helper | ヘルパーを生成するか(デフォルトはtrue) |
- *7 基本に分類されるオプションは、コントローラクラスの作成以外でも利用できます。
たとえば、以下はhelloというコントローラを作成する例です。
> cd c:\data\railbook …… フォルダの移動
> rails generate controller hello hello …… コントローラの作成
create app/controllers/hello_controller.rb
invoke erb
create app/views/hello
invoke test_unit
create test/controllers/hello_controller_test.rb
invoke helper
create app/helpers/hello_helper.rb
invoke test_unit
create test/helpers/hello_helper_test.rb
invoke assets
invoke coffee
create app/assets/javascripts/hello.js.coffee
invoke scss
create app/assets/stylesheets/hello.css.scss
|
app/controllersフォルダの配下にhello_controller.rbという名前で生成されたのがコントローラクラスの本体です。その他、デフォルトでは図2-4のようなフォルダやファイルが生成されますが、これらについては改めて該当する項で後述します。ここではとりあえず関連するファイル一式が正しく作成されていることを確認してください。
/railbook | |
---|---|
├─ /app | |
│ ├─ /assets | |
│ │ ├─ /javascripts | |
│ │ │ └─ hello.js.coffee | …… helloコントローラ固有のCoffee |
│ │ └─ /stylesheets | |
│ │ └─ hello.css.scss | …… helloコントローラ固有のSCSS |
│ ├─ /controllers | |
│ │ └─ hello_controller.rb | …… コントローラクラス本体 |
│ ├─ /views | |
│ │ └─ /hello | …… テンプレートの保存フォルダ |
│ ├─ /helpers | |
│ │ └─ hello_helper.rb | …… コントローラ固有のビューヘルパー |
└─ /test | |
├─ /controllers | |
│ └─ hello_controller_test.rb | …… コントローラ |
└─ /helpers | |
└─ hello_helper_test.rb | …… ビューヘルパーのテストスクリプト |
※上記の図で示されている「4.6節」と「8.4節」は転載対象外です。
コマンドを利用せずに自分で一からコントローラクラスを作成する場合でも、ファイルの配置先は図の構造に従う必要があります。
【NOTE】rails destroyコマンド
rails generateコマンドで自動生成したファイルは、rails destroyコマンドでまとめて削除することもできます。
> rails destroy controller hello
remove app/controllers/hello_controller.rb
invoke erb
remove app/views/hello
invoke test_unit
remove test/controllers/hello_controller_test.rb
invoke helper
remove app/helpers/hello_helper.rb
invoke test_unit
remove test/helpers/hello_helper_test.rb
invoke assets
invoke coffee
remove app/assets/javascripts/hello.js.coffee
invoke scss
remove app/assets/stylesheets/hello.css.scss
|
2.2.2 コントローラクラスの基本構文
hello_controller.rbをテキストエディタで開きます。最低限のコードは既にできているので、リスト2-1のようにコードを追加してください(追記部分は太字で表しています)。
1
2
3
|
# coding: utf-8
class HelloController < ApplicationController
def index
render text: 'こんにちは、世界!' # …… 4
end
end
|
シンプルなコードですが、注目すべきポイントは満載です。
1 ファイルはUTF-8で保存する
Rails標準の文字コードはUTF-8です。コントローラクラスをはじめ、後述するビュースクリプトやモデルクラスをテキストエディタで編集する場合には、必ずUTF-8で保存するようにしてください。
また、Ruby 1.9環境で、コントローラクラスやモデルクラスにマルチバイト文字(日本語)を含める場合には、ファイル先頭にマジックコメントを指定する必要があります。マジックコメントとは、スクリプトファイルの1行目に記述された
# coding: utf-8
|
のようなコメントのことです。これによって、Rubyの実行エンジンはスクリプトファイルで使用している文字コードを知ることができるわけです。マジックコメントがない状態でマルチバイト文字を使用した場合には、文字化けや例外が発生する原因ともなりますので、注意してください。
Ruby 2.0以降では、デフォルトの文字コードをUTF-8と見なすようになりましたので、マジックコメントの記述は不要になりました。本書のサンプルでもhelloコントローラを除いては、マジックコメントは省略します。
2 ApplicationControllerクラスを継承する
自動生成されたコードをそのまま使用する場合にはあまり意識する必要はありませんが、コントローラクラスはApplicationControllerクラス(正確にはその基底クラスであるActionController::Base*8)を継承している必要があります。
- *8 ApplicationControllerクラスは、実はActionController::Baseクラスを継承しただけの、(ほとんど)空のクラスです。アプリケーション共通の機能が必要になった場合には、ApplicationControllerクラスに実装します。具体的な方法については、6.6節(※転載対象外です)も参照してください。
ActionController::Baseクラスは、コントローラの基本的な機能を提供するクラスです。ActionController::Baseクラスがリクエスト/レスポンス処理に関わる基盤部分を担ってくれるので、開発者は原始的な処理を意識することなく、アプリケーション固有の記述に集中できるわけです。
3 具体的な処理を実装するのはアクションメソッド
アクションメソッド(アクション)とは、クライアントからのリクエストに対して具体的な処理を実行するためのメソッドです。コントローラクラスには、ひとつ以上のアクションメソッドを含むことができます。複数の関連するアクションをまとめたものが、コントローラであると言っても良いでしょう。
アクションメソッドであることの条件はただひとつ、publicなメソッドであることだけです。逆に、コントローラクラスの中でアクションとして公開したくないメソッドは、不用意にアクセスされないよう、private宣言しておくようにしてください。
4 アクションメソッドの役割とは
一般的なアクションメソッドの役割は、リクエスト情報の処理やモデル(ビジネスロジック)の呼び出し、ビューに埋め込むテンプレート変数(2.3.1項)の設定など、さまざまです。ただし、ここではもっともシンプルにアクションから文字列を出力するだけのコードを記述してみます。
文字列を出力するには、renderメソッドでtextオプションを指定します。
【構文】renderメソッド
render text: value
|
value: 出力する文字列
これで指定された文字列がブラウザに返されるようになります。
もっとも、本来のModel - View - Controllerという考え方からすれば、コントローラから出力を直接生成するのは不適切です。あくまで、この方法はデバッグ用途などの例外的な書き方であると理解しておいてください*9。
- *9 ただし、本書では動作を確認するために随所で登場しますので、きちんと覚えておいてください。
2.2.3 ルーティングの基礎を理解する
ルーティングとは、リクエストURLに応じて処理の受け渡し先を決定すること、または、そのしくみのことを言います。Railsでは、クライアントからの要求を受け取ると、まずはルーティングを利用して呼び出すべきコントローラ/アクションを決定します(図2-5)。
ルーティング設定(ルートとも言います)は、/config/routes.rbに定義します。
デフォルトで既に大量のコードが記述されていますが、そのほとんどはルートのサンプルを示したコメント行です。
ここではリスト2-2のようなルートを追加しておきましょう。
Railbook::Application.routes.draw do
…中略…
match ':controller(/:action(/:id))', via: [ :get, :post, :patch ]
end
|
matchメソッドの引数はURLパターンを表します。「:名前」の部分は変数のプレイスホルダで、:controllerと:actionがコントローラとアクションの名前を、:idがアクションメソッドに渡される任意のパラメータ(ルートパラメータ*10)を表します。
- *10 ルートパラメータを取得する方法については、改めて3.3.1項(※転載対象外です)で解説します。
丸カッコで括られている部分は、そこが省略可能であるという意味です。
つまり、ここで定義されたURLパターンは、図2-6のようなリクエストURLにマッチします。
このルート定義によって、すべてのアクションメソッドが「/controller/action」の形式で呼び出せるようになりますので便利です。
もっとも、実はこのルート定義は、本来、Railsが理想とするRESTfulの思想には適しません。また、無条件にすべてのアクションにアクセスできてしまうのも望ましい状態ではないでしょう。本書では、まずルーティングを強く意識しなくても学習を進められるよう、あえてこの設定を有効にしていますが、実際のアプリケーションでは、第7章(※転載対象外)での解説に従って、個別にルートを定義してください。
2.2.4 サンプルの実行
ここまでで作成したのは、Model - View - Controllerのうち、Controllerに相当する部分だけですが、これだけでも最低限の動作は確認できます。まずは、この状態でhelloコントローラの挙動を確認してみましょう*11。
http://localhost:3000/hello/index
- *11 開発モードではアプリケーションの変更が自動的に検出されますので、コードの変更があった場合にもサーバの再起動は必要ありません。
前項での設定に従って、helloコントローラのindexアクションを呼び出すには「/hello/index」が末尾に付くようなURLを指定します。コントローラ名とアクション名がそのままパスになるのです(ただし、コントローラ名の頭文字は小文字となります*12)。
- *12 アクション名が省略された場合、デフォルトでindexアクションと見なされますので、「http://localhost:3000/hello/」としても構いません。
図2-7のようなメッセージが表示されれば、サンプルは正しく動作しています。
2.2.5 補足:コントローラの命名規則
第1章でも触れたように、Railsの基本的な思想は「設定よりも規約(Convention over Configuration)」です。Railsを習得する最初の一歩は、関連するファイルやクラスの名前付けルールを理解することです。
ここまでの手順では、なんとなくhelloという名前のコントローラを作成しただけでコーディングを進めてきましたが、実は自動生成されたファイルは、既にRailsの命名規約に則って用意されています。自動生成されたファイルをそのまま利用している分にはあまり意識する必要がありませんでしたが、改めてここでコントローラの命名規則をまとめ、理解しておきましょう。表2-3の名前(例)は、コントローラ名を「hello」とした場合の例です。
種類 | 概要 | 名前(例) |
---|---|---|
コントローラクラス | 先頭は大文字で、接尾辞に「Controller」 | HelloController |
コントローラクラス(ファイル名) | コントローラクラスを小文字にしたもの、単語の区切りはアンダースコア | hello_controller.rb |
ヘルパーファイル名 | コントローラ名に接尾辞「_helper.rb」 | hello_helper.rb |
テストスクリプト名 | コントローラ名に接尾辞「_controller_test.rb」 | hello_controller_test.rb |
以降でも、コードの中身は正しいはずなのに、正しく意図した機能が呼び出されないという状況に遭遇した場合には、まず名前に誤りがないかを確認するクセを付けるようにしてください。Railsにおいて、名前はすべてを紐付ける鍵なのです*13。
- *13 構文規則ではありませんが、コントローラ名はできるだけリソース(操作対象のデータ)の名前に沿って命名するのが望ましいとされています。たとえば、membersテーブルを操作するためのコントローラであれば、membersコントローラ(members_controller.rb)とするのが望ましいでしょう。
■
次回は「2.3 ビューの基本」を説明します。
※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
2. Railsを利用するための環境設定
Railsプログラミングに必要なソフトウェアを紹介。WindowsおよびLinuxにおける環境設定の手順や、SQLite/DevKit/Node.js/Railsのインストール方法を説明する。書籍転載の2本目(「第1章 イントロダクション」より)。
3. Ruby on Rails 4アプリケーションの作成
環境が整ったら、いよいよアプリ作成を始めよう。スケルトンコードの生成から、Webサーバー上で実際にRailsアプリを動かすところまでを説明。