簡単な Rails アプリケーションの作成

前回は Ruby の開発環境をインストールしたので、ここでは簡単な rails アプリケーション、いわゆる rails 版「Hello, World!」アプリを作成してみます。「RailsによるアジャイルWebアプリケーション開発 第4版」を参考にしました。

rails new の実行

「rails new」コマンドを使って rails アプリケーションを作成します。このとき、「--skip-bundle」オプションを指定し、これと同時に bundle install が実行されるのを防止します。つぎのコマンドを実行すると、アプリケーションと同名の「demo」という名前のサブディレクトリを作成し、そこに rails アプリケーションを配置します。

$ rails new demo --skip-bundle

bundle insall の実行

「rails new」コマンドが終了したことを確認したら、アプリケーションのディレクトリに移動し、「bundle install」コマンドを実行します。これにより、その rails アプリに必要なすべての gem パッケージが一括でインストールされます。root 以外のユーザーで「bundle install」を実行すると、それらの gem パッケージは「.gem」ディレクトリの下にインストールされます。インストール時にバージョンコンフリクトなどのエラーが発生する場合は、この「.gem」ディレクトリとアプリケーションのサブディレクトリ「demo」を削除してから最初からやり直してみてください。

$ cd demo
$ bundle install

「bundle install」を実行したときにインストールされる gem パッケージの一覧は Gemfile に記述されています。「bundle install --path vendor/bundle」というコマンドを使うことで、gem パッケージをアプリケーションのディレクトリ内にインストールすることも可能です。こうすることで、他のアプリとの gem パッケージのバージョンコンフリクトを防止することができます。redmine など、配布が必要なアプリは、アプリケーションのディレクトリ内に gem パッケージを配置する形でインストールします。

参考)
http://bundler.io/bundle_install.html
http://blog.redmine.jp/articles/3_0/installation_centos/

rails アプリケーションの起動

rails アプリには WEBrick と呼ばれる開発用の Web Server が付属しています。これを起動するには、つぎのコマンドを実行します。

$ rails server

これによって rails アプリにアクセスすることができます。ブラウザから「http://127.0.0.1:3000」にアクセスして空のアプリの画面が表示されることを確認してください。WEBrick を停止するには、CTRL+C を入力して停止します。

rails のバージョンの指定

特定のバージョンの rails を明示的に指定してインストールすることもできます。

例)
$ gem install rails -v 4.2.0
$ rails new demo
$ cd demo & rails s

すべての利用可能な rails のバージョンはつぎのコマンドで検索できます。

$ gem list --remote --all rails | grep '^rails '

ただし、ruby のバージョンと rails バージョンの互換性を確認したうえで rails のバージョンを選択する必要があります。以下の互換性が推奨されているようです。

Rails 4.0 – Ruby 2.0 以上を推奨
Rails 4.1/4.2 – Ruby 2.1 以上を推奨
Rails 4.2.1 – Ruby 2.2 以上を推奨

コントローラとアクションメソッドの作成

rails アプリケーションのカスタマイズの最初のステップは、コントローラとアクションメソッドの作成です。簡単に説明すると、アクションメソドはブラウザから送信された URL にもとづいてコールされる関数のことです。そして、コントローラはアクションメソドを集めたものです。文法的にはコントローラはクラスとして実装され、アクションメソドは、そのクラスのインスタンスメソドとして実装されます。つぎのコマンドはコントローラ「Say」を作成し、アクションメソッド「hello」および「goodbye」を作成します。

$ rails generate controller say hello goodbye

これにより SayController クラスが作成され、その中に hello メソド、goodbye メソド が定義されます。SayController クラスは rails フレームワークが提供する ApplicationController クラスを継承しています。

アクションメソッドにロジックを記述

作成されたアクションメソッドの中身は空っぽなので、この中にいわゆるビジネス・ロジックを記述していきます。これには「app/controllers/say_controller.rb」ファイルを開いての hello メソッドをつぎのように変更します。現在時刻を取得してその値をインスタンス変数 @time に格納しています。

class SayController < ApplicationController
  def hello
    @time = Time.now
  end

  def goodbye
  end
end

アクションメソドが実行された後は、自動的に同名のビューの処理に引き継がれ、HTML レンダリングがおこなわれます。このとき、アクションメソドの中で作成したインスタンス変数 @time はビューに引き渡されます。

ビュー(テンプレート)の内容を記述

「ビュー」はアクションメソッドで設定されたインスタンス変数の内容を受け取り HTML をレンダリングする機能を持ちます。「ビュー」のことを「テンプレート」とも呼びます。ファイル名の拡張子は「.html.erb」となっており、これは「Embedded Ruby」を意味します。Windows の ASP (Active Server Pages) や Java の JSP (Java Server Pages) と同等のものになります。

「app/views/say/hello.html.erb」ファイルを開いて以下のように変更します。ビューの中でアクションメソッドから渡されたインスタンス変数 @time を参照しています。

<h1>railsからこんにちは!</h1>
<p>現在の時刻は <%= @time %> です。</p>

「app/views/say/goodbye.html.erb」ファイルを開いて以下のように変更します。

<h1>さようなら!</h1>
<p>ご訪問ありがとうございました。</p>

各ビューのテンプレートの中には HTML ページの <body> 〜 </body> タグの内側の部分のみを記述します。ここで記述した内容はさらに外枠の共通テンプレート「app/views/layouts/application.html.erb」に取り込まれ、これによって <body> 〜 </body> タグの外側の部分がレンダリングされて出力されます。

アプリの画面を表示する

ブラウサで以下の URL を開いて内容を確認します。URL のクエリーの部分が「http://〜/コントローラ名/アクションメソド名」となっていることに注意してください。

http://127.0.0.1:3000/say/hello
および
http://127.0.0.1:3000/say/goodbye

ブラウサから送信された URL のパターンもとづいてコントローラの中のアクションメソッドが呼び出され、アクションメソッドで設定した内容が、ビューに反映されて HTML ページに表示されることがわかります。

ルーティングについて

上記で「ブラウサから送信された URL のパターンもとづいてコントローラの中のアクションメソッドを呼び出す」と述べましたが、こうした処理のことを「ルーティング」と呼び、このルーティングの設定は「config/routes.rb」ファイルに記述します。

Rails.application.routes.draw do
  get 'say/hello'

  get 'say/goodbye'

end

例えば「http://127.0.0.1:3000/」が呼び出されたときに、indexページ(rootページ)として、hello ページを表示したい場合は、つぎのように「root ‘say#hello’」の行を追加します。また、どの URL パターンにも当てはまらないときに goodbye ページを表示したい場合は「match ‘*path’, to: ‘say#goodbye’, via: :all」の行を追加します。

Rails.application.routes.draw do
  root 'say#hello'

  get 'say/hello'

  get 'say/goodbye'

  match '*path', to: 'say#goodbye', via: :all

end