Ruby on Rails を使ってみよう(その 4)

View と Controller を作る(その 2)

View の続きとして、レイアウトの作成をします。今回はベースになっている sample/app/views/layouts/application.html.erb を手直しして、新たに cust_layout.html.erb を作成します。元の application.html.erb はこうなっています。

<!DOCTYPE html>
<html>
<head>
  <title>Sample</title>
  <%= stylesheet_link_tag    "application", :media => "all" %>
  <%= javascript_include_tag "application" %>
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

</body>
</html>

これを編集して sample/app/views/layouts 直下に cust_layout.html.erb を作ります。

<!doctype html>
<html>
<head>
  <title>Sample</title>
  <%= stylesheet_link_tag params[:controller], :media => "all" %>
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

</body>
</html>

CoffeeScript は今回は使わないので、script 要素に関する部分を削除しました。そして CSS は Controller 別に違うものを読み込むように設定を変更しています。

最後に sample/app/assets/stylesheets/custsearch.css.scss を編集します。

h1 {
  font-size : x-large;
  text-align : center
}

table { margin : auto }

p { text-align : center }

View は以上で完成です。最後に Controller を作ります。sample/app/controllers/custsearch_controller.rb は最初はこうなっているはずです。

class CustsearchController < ApplicationController
  def index
  end

  def search
  end
end

これを以下のように編集します。

class CustsearchController < ApplicationController
  layout 'cust_layout'

  def index
    @customer = Customer.new
  end

  def search
    id = params[:customer]["id"]
    @customer = Customer.find(id)
  end
end

2 行目に使用するレイアウト名を記述します。指定しなければデフォルトで application.html.erb が使われます。

4 〜 6 行目は index アクションの定義です。これは初期画面なので、変数 @customer に Customer.new で空のインスタンスを入れておきます。

8 〜 11 行目は search アクションの定義です。params を使ってフォームに入力された値を取得します。find はあらゆる Model クラスに共通のメソッドで、主キーの値が引数に一致するデータを取得してきます。

Controller は以上で完成です。

ルーティングの設定

sample/config/routes.rb を見ると以下のようになっているはずです。

Sample::Application.routes.draw do
  get "custsearch/index"

  get "custsearch/search"

  # (略)
end

index は初期画面なので get でいいのですが、search はフォームの入力値が送られてくる画面なので post メソッドでアクセスしないといけません。そこで routes.rb を書き変えます。

Sample::Application.routes.draw do
  get "custsearch/index"

  post "custsearch/search"

  match "custsearch" => "custsearch#index", :via => :get

  # (略)
end

これで localhost:3000/custsearch/search には常に post メソッドでアクセスすることになります。三つ目の match は「localhost:3000/custsearch」にアクセスしたら custsearch の index アクションを実行し、get メソッドでアクセスしてください、という命令です。index とかいちいち打ち込むのは面倒でしょうからこれは設定しておくと便利かと思います。

実行してみる

コマンドプロンプトから sample ディレクトリで

> rails server

と打ち込んでください。WEBrick という簡易 Web アプリケーションサーバが起動します。port は 3000 です。サーバが起動したらブラウザ(できれば IE 以外で !)を立ち上げて localhost:3000/custsearch にアクセスしてみてください。下のような画面は出たでしょうか ?

顧客 ID 以外のテキスト入力欄は入力ができないようになっているはずです。ためしに ID の欄を空白のままで「検索」ボタンを押してみましょう。

怒られましたね。では適当に数字を入力してみましょう。

検索結果が表示されました。

以上が Ruby on Rails の基本になります。Java による Web アプリケーションと違い、命名規則に従うだけで関連する MVC が動作して結果をきちんと返してくれるのが Ruby on Rails の特長*1です。Ruby 単体でも良くできたプログラミング言語ですが、そこに Rails というフレームワークを組み合わせることで、Ruby の良さを存分に生かしながら Web アプリケーション開発ができます。Rubist なら Rails 使わなきゃ損ですよ ! (ステマ)

*1:CakePHP も同様。そもそも CakePHPRuby on Rails を参考にして作られた PHP 用のフレームワークです。