スクラッチでRails3に挑戦 Part 2(idで指定したレコードだけ表示してみる)

前回とりあえず,既に作成済みのMySQLデータベースのテーブルの内容を,Webページに表示してみる...というところまで終わりました.

さて,その続きになりますが,まずは関係ないところで,time zoneとlocaleを日本仕様にしておきましょう.

[config/application.rb]

module Sample
  class Application < Rails::Application
    :

    config.time_zone = 'Tokyo'
    :
    config.i18n.default_locale = :ja
    :

さて,本題です.とりあえずこの「students」テーブルを保守するアクションを定義して行きましょう.

まずは,学生一人(一件)のデータを表示するページを作成します.

前回,routes.rbにて,「resourses :students」と定義しましたので,次のように「rake routes」で確認すると,レコードデータ一件を表示させるには,「show」アクションを用意すれば良いことが分かります.

$ rake routes
 :
student GET    /students/:id(.:format)      {:action=>"show", :controller=>"students"}

 :

では,ジェネレータでStudentsコントローラにshowアクションを生成したいと思います.

$ rails g controller Students show

...と前回「index」を定義したときと同様のコマンドを実行してみると...

何だか,「students_controller.rb」がコンフリクトで上書きするかどうかと聞いてきました.
どうせ「show」メソッドが追記されるんだろうと思って,ええよということで「Y」にしたら,前回実装した「index」メソッドが消えてなくなりました...「show」アクションを追加と言っても,「app/view/students/show.html.erb」というファイルが新規作成されるだけですので,1回コントローラを作成したら,アクションの追加は手作業でやれということなんでしょう.やれやれ...

ところで,routes.rbの中身はどーなっている?ということで,確認してみると...

[config/routes.rb]

Sample::Application.routes.draw do
  get "students/show"
  get "students/index"

  resources :students

  :

手動で私が記載したのは「resources :students」だけ.これは,CRUDベースでRESTfulな機構を利用したい場合は,これを書くだけで,7つのルーティング情報を定義してくれるものであります.「get 云々」で入っているのは多分ジェネレータが勝手に入れたものでしょう.とはいえ複数あるのもなんですので,一般的なルーティングの記載をしておきましょう.

[config/routes.rb]

Sample::Application.routes.draw do
  match 'students/:id', :to => 'students#show'
  match 'students', :to => 'students#index'
  :

これは,まず1つ目は,URL「http://〜/students/1234567890」でアクセスしてきたときは,studentsコントローラのshowアクションを実行し,パラメータとして,「:id => 1234567890」を渡すというのと,URL「http://〜/students」でアクセスしてきた際には,同じく,studentsコントローラのindexアクションを実行せよ,ということのようです.ですのでデフォルトの「get “students/index”」は単に,URL「http://〜/students/index」でアクセスしてきたときは...になるので,URLパスに「index」をつけないといけません.

では,Studentsコントローラにshowアクション(showメソッド)を実装しましょう.

[app/controllers/students_controller.rb]

class StudentsController < ApplicationController
  def index
    @students = Student.all
  end

  def show
    @student = Student.find(params[:id])
  end
end

上記のようにStudentモデルクラス(ActiveModelクラスの派生クラス)のfindメソッドを使用します.findの引数には,テーブルの「id」フィールドの値を指定します.studentsテーブルには主キーであるidフィールドが存在しますので,何かidの値を引数に入れれば一意にレコードを取得できます.引数には「params[:id]」とありますが,これは,URL「http://〜/students/1234567890」でアクセスしてきたときの,「1234567890」の値として取得されます.

結果,SQL文「SELECT * FROM students WHERE id = '1234567890'」の結果が,インスタンスフィールドである「@student」に格納されます.

このインスタンスフィールド@studentの値を,ビューである「show.html.erb」で整形して表示させます.

[app/views/students/show.html.erb]

<h1>学生情報</h1>

<ul>
  <li>ID: <%= @student.id %></li>
  <li>氏名: <%= @student.name %></li>
  <li>E-mail: <%= @student.email %></li>
</ul>

その結果がこれになります.

showアクションの結果

また,ビューで表示されるページ全体の外形というかレイアウトについては,「app/views/layouts/application.html.erb」で行います.

[app/views/layouts/application.html.erb]

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

<%= yield %>

<%= debug(params) if Rails.env.development? %>

</body>
</html>

これは,各ビューにおける共通レイアウトになります,ここの「<%= yield =>」の部分にindex.html.erbやshow.html.erbなどのビューが埋め込まれることになります.

今回ここに,1行だけ加えています.

<%= debug(params) if Rails.env.development? %>

これは,現在のビルド環境が,Development Mode である場合,paramsの値をデバッグ(表示)するという意味です.

その結果がこれになります.

showアクションの結果 デバッグ表示付き

これを入れておくと,コントローラを経由してビューにどういうパラメータが渡されているか良くわかります.

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中