Ruby on Rails入門

Ruby on Rails入門
2007-08-08
稚内北星学園大学
安藤 友晴
Ruby on Rails 概説
Ruby on Railsとは何か
MVCアーキテクチャによるWebアプリケー
ションフレームワーク
 プログラミング言語としてRubyを利用

– 名前でわかるけど

フルスタック
– Web周りからDB周りまで
諸元

作者
– David Heinemeier Hansson
– 略して “DHH” と呼ばれることが多い

ライセンス
– MITライセンス

歴史
– 2004年7月
– 2005年12月13日
– 2007年3月14日1.2
公開
1.0
DEMO
Ruby on Railsの考え方

Convention over Configuration
– CoC
– 「設定よりも規約」

Don't Repeat Yourself
– DRY
– 「同じことを繰り返さない」
MVCアーキテクチャ
(Model-View-Controller)
MVCアーキテクチャ
(Model-View-Controller)
Model
 View
 Controller

Railsの構成要素
ActiveSupport (Rubyクラスの拡張)
 ActionPack

– ActionView (View)
– ActionController (Controller)
ActiveRecord (DB接続, Model)
 ActiveWebService (Webサービス)
 ActionMailer (メールの送受信)
 railties (周辺ライブラリ・ツール)

環境構築 (Windows版)
1. Rubyのインストール
Windowsなら One-Click Ruby Installer を
利用すると楽
 http://rubyforge.org/projects/rubyinstalle
r/
 ruby186-25.exe をダウンロード
 ダブルクリックしてインストール開始

2. RubyGemsのインストール
RubyGemsはRubyのパッケージ管理システム
 One-Click Ruby Installer を使っていれば既にイ
ンストールされている
 そうでない人は下記サイトからダウンロード

– http://rubyforge.org/projects/rubygems/
3. PATHを通す
<Rubyのインストール先>/bin ディレクトリに
PATHを通しておく
 RubyGemsを別途インストールしている場合には
そこにもPATHを通す
 ruby -v コマンドの実行結果が次のようになれば
OK

$ ruby -v
ruby 1.8.6 (…)
$
4. Railsのインストール

次のコマンドでRailsをインストール
– gem install rails --include-dependencies
– Rails(と関連するソフトウェア)がインストールされる
5. MySQLのインストール
rootユーザの再設定が必要
 文字コードはUTF-8で
 詳細は別紙プリントを参照

Ruby超特急
Rubyとは
「まつもと ゆきひろ」氏が作成したプログラ
ミング言語
 1995年に発表
 オープンソースソフトウェア
 「オブジェクト指向スクリプト言語」
 Rubyを使った「Ruby on Rails」によって、最
近一躍有名に。
 http://www.ruby-lang.org/

ビューとコントローラ
やりたいこと
http://localhost:3000/hello/input にアクセ
ス
 名前を入力すると
 http://localhost:3000/hello/greeting で挨
拶してくれる
 データベースは利用しない

Railsのプロジェクト作成

以下のコマンドを入力して、helloというプロ
ジェクトを作成する
– andoh$ rails hello
コントローラの作成

hello ディレクトリに移動して、次のコマンド
を実行
– andoh$ ruby script/generate controller hello
input greeting

hello というコントローラと、input と greeting
というアクションを作成する。
生成された
app/controllers/hello_controller.rb
# コントローラ名は Hello + Controller
# ApplicationControllerを継承
class HelloController < ApplicationController
#inputアクション
def input
end
# greetingアクション
def greeting
end
end
URLとコントローラ
http://localhost:3000/hello/input
 http://localhost:3000/hello/greeting
 hello がコントローラ名
 inputとgreetingがアクション名

# コントローラ名は Hello + Controller
class HelloController < ApplicationController
#inputアクション
def input
end
# greetingアクション
def greeting
end
end
Railsアプリケーションの動作
1.
2.
3.
4.
5.
DispatcherがRequestを受け取る (HTTP)
コントローラとアクションを決定
コントローラ中のアクションが処理
ビューを処理
ブラウザにResponseを返す (HTTP)
Railsのビュー

eRubyフォーマットの実装であるERBが担
当
– eRubyはRubyのテンプレートエンジン

“(アクション名).rhtml” というファイル名
サーバを起動する
ruby script/server コマンドを実行
 WEBrick という Rails組み込みのWebサー
バが起動される

– デフォルトでは3000ポートで起動

アクションに対応したビューが表示される
– http://localhost:3000/hello/input
– http://localhost:3000/hello/greeting
app/views/hello/input.rhtmlに
フォームを追加
<h1>お名前を入力</h1>
ボタンを押したらgreeting
アクションに移る
<% form_tag :action => :greeting do %>
<%= text_field :input, :name %>
<%= submit_tag 'OK' %>
<% end %>
text_filed object_name, method, options = {}
app/controllers/hello_controller.rb
を編集
# @params はパラメータ情報を管理するため
# のインスタンス変数
# アクションで定義されたインスタンス変数は
# ビューで利用できる
def greeting
@str = @params.inspect
end
app/views/hello/greeting.rhtml
を編集
<%= @str %>
greetingアクションの@str変数の値を
表示
実行
input のテキストフィールドに「安藤友晴」と入力し
てボタンを押すと
 greeting で次の文字列が表示される

{ "commit"=>"OK", "action"=>"greeting",
"controller"=>"hello",
"input"=>{"name"=>"安藤友晴"} }

これがパラメータの情報になる
greetingで名前を表示する

app/controllers/hello_controller.rb を編集
def greeting
@name = @params[:input][:name]
end

app/views/hello/greeting.rhtmlを編集
<h1>ごあいさつ</h1>
<%= "こんにちは、#{@name}さん" %>
<% form_tag :action => :input do %>
<%= submit_tag '戻る' %>
<% end %>
config/routes.rb
ActionController::Routing::Routes.draw do |map|
map.connect ':controller/service.wsdl', :action => 'wsdl'
map.connect ':controller/:action/:id.:format'
map.connect ':controller/:action/:id'
end
#
#
#
#
#
map.connect ‘:controller/:action/:id’ に着目
URLの形式が <コントローラ名>/<アクション名>/<id> で
あることを示している
このファイルに
map.connect 'h/:action/:id', :controller => 'hello'
# を追加したらどのように動くだろうか?
データベースの取り扱い
基本的な作業手順
(本の管理アプリケーション)









データベース(MySQL)の準備
rails books
config/database.yml の編集
MySQLでデータベース作成
ruby script/generate model book title:string author:string
publisher:string isbn:string published_on:date
rake db:migrate
ruby script/generate scaffold Book
サーバの立ち上げ
アプリケーションの修正
database.yml
development:
adapter: mysql
database: books_development
username: root
password: tomoharu
socket: /var/lib/mysql/mysql.sock
encoding: utf8
test:
database: books_test
……
production:
database: books_test
……
エンタープライズアプリケーションアー
キテクチャパターン








マーチン・ファウラー著
翔泳社
ISBN: 4-7981-0553-8
エンタープライズ・アプリケーションの設計
技法について。オブジェクト指向設計全般
で参考になる
原書名: 「Patterns of Enterprise
Application Architecture」
翻訳の質は微妙
「PofEAA」とか「PoEAA」と呼ばれる
http://capsctrl.que.jp/kdmsnr/wiki/PofEAA
/
データソースのアーキテクチャパ
ターン
Table Data Gateway
 Row Data Gateway
 Active Record
 Data Mapper

Active Record パターン

データと振る舞いの両方を持つオブジェク
ト。Personクラス自身にデータベースにア
クセスする処理が記述されている。
データベースに対するCRUD

Create
– テーブルへの情報の追加
– insert into 文

Read
– テーブルからの情報の読み出し
– select文

Update
– テーブルの情報の更新
– update文

Delete
– テーブルの情報の削除
– delete文
Active Record とCRUD
Create
b = Book.new
b.title = ‘…’;
b.save
 Read
b = Book.find(id)

Active Record とCRUD
Update
b = Book.find(id)
b.title = ‘…’
b.save
 Delete
b = Book.find(id)
b.destroy

findメソッド
books = Book.find(:all,
:conditions=>[“title like ?”, % + Ruby + %]
# conditions の値は、SQLのwhere句の内容
Ajax
Ajax ということば

“Ajax”という名前のはじまり
–
–
–
–

Ajax: A New Approach to Web Applications
Jesse James Garrett 氏
2005年2月18日
http://www.adaptivepath.com/publications/essays/archives/00
0385.php
日本語訳
– Ajax: Web アプリケーション開発の新しいアプローチ
– けんたろ 氏
– http://antipop.gs/docs/translations/ajax.html
Ajax

Ajax = Asynchronous JavaScript + XML
– Asynchronous = 非同期

技術的な特徴
– Ajax Engineを用いる
– Webサーバと非同期に通信する
Ajax Engineを用いる


従来のクライア
ントとサーバの
間に Ajax
Engine が入る
Ajax Engine
– ユーザインタ
フェースのレン
ダリング
– 必要に応じて
サーバと通信
する
Webサーバと
非同期に通信する

WebブラウザとWeb
サーバが通信してい
るあいだ、クライアント
側では待ち時間が発
生しない
Ajaxの構成技術
Ajaxの構成技術
HTML (XHTML)
 JavaScript
 DOM (Document Object Model)
 CSS (Cascading Style Sheet)
 XML
 XMLHttpRequest

JavaScript

(基本的には)Webブラウザ上で動作するプ
ログラミング言語
– Java言語とは関係ない

オブジェクト指向言語
– 「関数型言語」でもある

“ECMAScript” として標準化されている
JavaScript: 世界で最も誤解され
たプログラミング言語

(原文) JavaScript: The World's Most
Misunderstood Programming Language
– http://www.crockford.com/javascript/javascri
pt.html

http://d.hatena.ne.jp/brazil/20050829/112
5321936
DOM
(Document Object Model)
HTMLやXML文書をアプリケーションから
操作するためのAPI
 HTMLやXML文書をツリー構造として扱う

XMLHttpRequest
Webサーバからデータを取得するためのオ
ブジェクト
 もともと Microsoft 社が Internet Explorer
に実装
 ほかのブラウザも追随
 標準化された規格という訳ではない

XMLHttpRequestで
できること

“XML”
– XMLじゃなくても、テキストファイルやJSONで
の受け渡しが可能

“Http”
– HTTPじゃなくても大丈夫 (なこともある)。ロー
カルのテキストファイルなど。
Ajaxのプログラミング
JavaScriptの利用
Ajaxのプログラミングでは、JavaScriptを利
用するのが基本
 配慮すべきことが多い

– Webブラウザごとの挙動の違い
– 機能が少ない
JavaScriptライブラリの利用









DOJO Toolkit
Prototype.js
Yahoo! UI Library
script.aculo.us
Rico
Google Web Toolkit
Zimbra
Kabuki
……
他のシステムとの連携

JavaScriptのプログラムは、他のシステム
と連動して動くことが多い
– たとえばデータベースへのアクセスなど
Restfulなサービス
REST

分散システムのアーキテクチャスタイル
– 「スタイル」であって仕様が存在しているわけ
ではない
Roy Fielding (HTTPのプロトコル作成者の
一人) が考案
 RESTの考え方に従ったスタイル

– Restful
RESTの考え方
すべてのリソースをURIで
 すべてのリソースにHTTPでアクセス
 ステートレスであること
 XMLでリソースを扱うことが多い

リソースへの “CRUD”

Create
– 情報の追加
– POSTメソッド (HTTP)

Read
– 情報の読み出し
– GETメソッド (HTTP)

Update
– 情報の更新
– PUTメソッド (HTTP)

Delete
– 情報の削除
– DELETEメソッド (HTTP)
落ち穂拾い
サーバ
WEBrickは遅いので実運用には不向き
 よくある組み合わせ

– Lightty + FastCGI + Apache
– Mongrel + Pound + Apache
• DHH推奨
Mongrel + Pound + Apache

Mongrel
– Railsでの利用が一般的になりつつあるWebサーバ
– gem install mongrel でインストール
– Mongrelをインストールすると、ruby script/server コマ
ンドでMongrelが起動

Pound
– リバースプロキシ + ロードバランサ

Apache Http Server
– 静的コンテンツ
バリデータ
入力された値を検証するためのもの
 モデルに記述

class Book < ActiveRecord::Base
validates_presence_of :title, :author
validates_uniqueness_of :isbn
validates_format_of :isbn, :with => /[0-9xX¥-]+/
end
バリデータの種類 (1)
#必須項目のチェック
validates_presence_of :title, $author
#長さチェック
validates_length_of :username, :minimum => 6, :maximum => 8
#数値であるかチェック
validates_numericality_of :number
バリデータの種類 (2)
#値がユニークであるかチェック
validates_uniqueness_of :email
#正規表現によるチェック
validates_format_of :isbn, :with => /[0-9xX¥-]+/
アプリケーションの日本語化
日本語化の手法
Ruby Gettext Package を使う
 Rubyで書かれたアプリケーションを国際化
するためのフレームワーク
 インストール

gem install gettext
準備

config/environment.rb を編集
require 'gettext/rails’

app/controllers/application.rb を編集
init_gettext 'book' # プロジェクト名を指定
Gettextで利用するファイル

poファイル
– 人間が利用するファイル

moファイル
– アプリケーションが利用するファイル
Gettext Scaffold generator
プラグイン

プラグイン
– Railsの機能を拡張するためのしくみ

Gettext Scaffold generator
– これを使うとpoファイルやmoファイルの作成が楽にな
る

インストール
ruby script/plugin install
svn://rubyforge.org/var/svn/gettextscaffold/ge
ttext_scaffold
利用手順 (1)

rake gettext:setup
– poファイルとmoファイル(の雛形)を作成

rake gettext:update_po
– ビューやモデルから日本語化すべき部分を追
加する
利用手順 (2)

po/ja/books.po ファイルの編集
msgid "Book|Author”
msgstr "著者"
利用手順 (3)

日本語化したい文字列を _( ) メソッドで囲
い、po/ja/books.po ファイルを編集
<%= link_to _('Show'), …
msgid "Show”
msgstr "表示"
利用手順 (4)

rake gettext:make_mo
– moファイルの生成