Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
書籍転載:Ruby on Rails 4アプリケーションプログラミング

書籍転載:Ruby on Rails 4アプリケーションプログラミング

コントローラの基本

2014年4月30日

Railsプログラミングの基点は、MVCのControllerクラス。ここから具体的なコードを記述していこう。

  • このエントリーをはてなブックマークに追加

書籍転載について

 本コーナーは、技術評論社発行の書籍『Ruby on Rails 4アプリケーションプログラミング』の中から、特にBuild Insiderの読者に有用だと考えられる項目を編集部が選び、同社の許可を得て転載したものです。

 『Ruby on Rails 4アプリケーションプログラミング』の詳細や購入は技術評論社のサイト目次ページをご覧ください。

ご注意

本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどは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)
表2-2 rails generateコマンドの主な動作オプション
  • *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コントローラ固有のCoffeeScript(9.3節)
│ │ └─ /stylesheets  
│ │   └─ hello.css.scss …… helloコントローラ固有のSCSS(9.4節)
│ ├─ /controllers  
│ │ └─ hello_controller.rb …… コントローラクラス本体
│ ├─ /views  
│ │ └─ /hello …… テンプレートの保存フォルダ(2.3.2項)
│ ├─ /helpers  
│ │ └─ hello_helper.rb …… コントローラ固有のビューヘルパー(4.6節)
└─ /test  
  ├─ /controllers  
  │ └─ hello_controller_test.rb …… コントローラ
  └─ /helpers  
    └─ hello_helper_test.rb …… ビューヘルパーのテストスクリプト(8.4節)
図2-4 rails generateコマンドで自動生成されたファイル

上記の図で示されている「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のようにコードを追加してください(追記部分は太字で表しています)。

Ruby
1
 
2
3



# coding: utf-8

class HelloController < ApplicationController
  def index
    render text: 'こんにちは、世界!' # …… 4
  end
end
リスト2-1 hello_controller.rb

 シンプルなコードですが、注目すべきポイントは満載です。

1 ファイルはUTF-8で保存する

 Rails標準の文字コードはUTF-8です。コントローラクラスをはじめ、後述するビュースクリプトやモデルクラスをテキストエディタで編集する場合には、必ずUTF-8で保存するようにしてください。

 また、Ruby 1.9環境で、コントローラクラスやモデルクラスにマルチバイト文字(日本語)を含める場合には、ファイル先頭にマジックコメントを指定する必要があります。マジックコメントとは、スクリプトファイルの1行目に記述された

Ruby
# 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メソッド

Ruby
render text: value

 value: 出力する文字列

 これで指定された文字列がブラウザに返されるようになります。

 もっとも、本来のModel - View - Controllerという考え方からすれば、コントローラから出力を直接生成するのは不適切です。あくまで、この方法はデバッグ用途などの例外的な書き方であると理解しておいてください*9

  • *9 ただし、本書では動作を確認するために随所で登場しますので、きちんと覚えておいてください。

2.2.3 ルーティングの基礎を理解する

 ルーティングとは、リクエストURLに応じて処理の受け渡し先を決定すること、または、そのしくみのことを言います。Railsでは、クライアントからの要求を受け取ると、まずはルーティングを利用して呼び出すべきコントローラ/アクションを決定します(図2-5)。

図2-5 ルーティングとは?

 ルーティング設定(ルートとも言います)は、/config/routes.rbに定義します。

 デフォルトで既に大量のコードが記述されていますが、そのほとんどはルートのサンプルを示したコメント行です。

 ここではリスト2-2のようなルートを追加しておきましょう。

Ruby
Railbook::Application.routes.draw do
  …中略…
  match ':controller(/:action(/:id))', via: [ :get, :post, :patch ]
end
リスト2-2 routes.rb

 matchメソッドの引数はURLパターンを表します。「:名前」の部分は変数のプレイスホルダで、:controllerと:actionがコントローラとアクションの名前を、:idがアクションメソッドに渡される任意のパラメータ(ルートパラメータ*10)を表します。

  • *10 ルートパラメータを取得する方法については、改めて3.3.1項(転載対象外です)で解説します。

 丸カッコで括られている部分は、そこが省略可能であるという意味です。

 つまり、ここで定義されたURLパターンは、図2-6のようなリクエストURLにマッチします。

図2-6 URLパターンとマッチするURLの例
図2-6 URLパターンとマッチする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-7 アクションで指定したメッセージを表示
図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
表2-3 コントローラ関連の命名規則

 以降でも、コードの中身は正しいはずなのに、正しく意図した機能が呼び出されないという状況に遭遇した場合には、まず名前に誤りがないかを確認するクセを付けるようにしてください。Railsにおいて、名前はすべてを紐付ける鍵なのです*13

  • *13 構文規則ではありませんが、コントローラ名はできるだけリソース(操作対象のデータ)の名前に沿って命名するのが望ましいとされています。たとえば、membersテーブルを操作するためのコントローラであれば、membersコントローラ(members_controller.rb)とするのが望ましいでしょう。

 次回は「2.3 ビューの基本」を説明します。

※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

書籍転載:Ruby on Rails 4アプリケーションプログラミング
1. Railsというフレームワーク

一般的なフレームワークについて触れた後、Railsの特徴、具体的な機能について概説。書籍転載の1本目(「第1章 イントロダクション」より)。

書籍転載:Ruby on Rails 4アプリケーションプログラミング
2. Railsを利用するための環境設定

Railsプログラミングに必要なソフトウェアを紹介。WindowsおよびLinuxにおける環境設定の手順や、SQLite/DevKit/Node.js/Railsのインストール方法を説明する。書籍転載の2本目(「第1章 イントロダクション」より)。

書籍転載:Ruby on Rails 4アプリケーションプログラミング
3. Ruby on Rails 4アプリケーションの作成

環境が整ったら、いよいよアプリ作成を始めよう。スケルトンコードの生成から、Webサーバー上で実際にRailsアプリを動かすところまでを説明。

書籍転載:Ruby on Rails 4アプリケーションプログラミング
4. 【現在、表示中】≫ コントローラの基本

Railsプログラミングの基点は、MVCのControllerクラス。ここから具体的なコードを記述していこう。

書籍転載:Ruby on Rails 4アプリケーションプログラミング
5. ビューの基本

Railsプログラミングの最大の特徴は「MVC」。Controllerの次はViewの基本をマスターしよう。そこで使われる「ERBテンプレート」とは?

サイトからのお知らせ

Twitterでつぶやこう!