Ruby on Rails 入門

      2008. 3. 10
   株式会社万葉 大場寧子
自己紹介

実装大好きプログラマ

Award on Rails 2006 大賞受賞

Ruby歴2年

会社を作りました
デブサミ後の飲み会にて


キムラデービーさんと感動の(?)再会

ちょうどいいから Ruby on Rails の入
門講師をやってください
Ruby on Rails


Webアプリケーションフレームワーク

Ruby

オールインワン
RoRとの出会い

2006年春

マネージャーをやめてプログラムを楽
しむことにする

Java サーバの用意を旦那にねだる
RoRとの出会い

2006年春

マネージャーをやめてプログラムを楽
しむことにする

Java サーバの用意を旦那にねだる

         断られた
ふてくされる

ミドルウェア苦手です

代わりに「Ruby on Rails」の本を手渡
される

なぜか環境も用意されている

・・・・しぶしぶ手をつける
RoR ってスゴイ!


スイスイ作れる

実は本格的

かゆいところに手が届く
楽しい!


そのままどんどん作り続けた

旦那が、Award on Rails を薦める

大賞・審査員特別賞を頂戴する
ずっと RoR

業務でもRuby on Rails

 ECサイト

 SNS

 医事会計

 地球の歩き方 旅すけ
今日のお題

Ruby ってどんなカンジ?

Ruby on Rails の雰囲気をつかむ

ActiveRecord について少し詳しく

実際に現場で使っての感想
時間配分

Ruby - 10分

Ruby on Rails - 30分

ActiveRecord - 20分

現場 - 5分
Ruby って
  どんなカンジ?

とてもイイ

目を慣らさないと Rails に入れない

Rails に行く前に軽く説明します
Ruby 事始め
        用意するもの
Ruby, RubyGem

RoR 対応バージョンは 1.8

Windows なら One-Click Installer

http://rubyinstaller.rubyforge.org/wiki/wiki.pl
irb

Ruby の動作を対話的に試せる


> irb


 これを使いながらRubyの動作を
    説明していきます。     DEMO
クラスの定義
class Dog


end



 Dog というクラスができます

                   DEMO
インスタンスを作る

dog = Dog.new

 dog という変数ができます

 Dog クラスのインスタンスが作ら
 れ、dog に代入されます

                     DEMO
メソッドの定義
class Dog
 def say
   p 'Baw!'
 end
end

  インスタンスメソッド say を定義する
                   DEMO
メソッドを呼ぶ

dog = Dog.new
dog.say



 dog の say メソッドを呼ぶ

                     DEMO
引数のあるメソッド

def eat(food)
 if food
   p 'Thank you!'
 else
   p 'oooooo'
 end
end
                    DEMO
引数のある
     メソッドを呼ぶ


dog = Dog.new
dog.eat(100)




                DEMO
メソッドの () の省略

dog = Dog.new
dog.eat 100


 省略してもわかるものは省略できる

 書式の統一よりのびのびした使い勝手

 自由 > 統制
                DEMO
インスタンス変数
class Dog
 def name=(name)
   @name = name
 end
end

 @がついた変数はインスタンス変数

 外部から直接アクセスできない    DEMO
クラスを調べてみる
dog.kind_of?(Dog)
dog.kind_of?(Object)
dog.kind_of?(String)
p dog.class

 継承元クラスを明示的に指定しないと
 Object クラスの派生クラスになる
                    DEMO
クラスの継承
class Sheltie < Dog
 def say
   p 'coon'
 end
end


  Dog の派生クラス Sheltie を作る
                           DEMO
すべてがオブジェクト

p 'Wow'.class
p 100.class
p Dog.class

 プリミティブ型という概念なし

 クラスもオブジェクト
                  DEMO
動的型づけ

型宣言なし

=すべての変数の型が Object である
のと一緒

型の整合性は気にしない

動作するかどうかだけが重要
文字列
"文字列です"
"その犬の種類は #{dog.class.name} で
す"

 Stringクラス

 "..."では、#{}で評価結果を埋め込むこ
 とができる
                     DEMO
文字コード

Ruby 1.8 では、文字列はバイト列

RoR では utf-8を使う

日本語の操作は正規表現万歳

Ruby 1.9 では国際化された
配列
a = Array.new
a = []
a = [1, 2, 3]
p a[1]
p a.size


 リスト操作は基本的に配列を使う
                     DEMO
ハッシュ
h = Hash.new
h = {}
h = {:id => 1, :name => 'Pochi'}
p[:id]
p[:name]

  RoRでは基本中の基本となるクラス

  :id ・・・シンボル(Symbol)              DEMO
引数にハッシュを渡す

dog.eat(
  {:name => 'meat', :price => 320}
)



  320円の肉を食べる

                                     DEMO
ハッシュの{ }の省略


dog.eat :name => 'meat', :price => 320




   任意のオプションを引数として渡すの
   に多用される
                   DEMO
null じゃなくて nil


世の中で false なのは nil と false だけ

0 も false ではない
あとのことは



Ruby リファレンスマニュアル

http://www.ruby-lang.org/ja/man/html/index.html
RoR事始め
    ∼用意するもの∼
> gem install rails

  Rails を Ruby 環境に入れる

  Rails の最新バージョンは 2.0.2

  DBを用意

  IDE(Aptana, NetBeans etc)を用意
アプリケーションを作る

  IDE から New Project

  コマンドラインなら次のようにする

> rails myapp

   →プロジェクトで使うファイルや
    ディレクトリ構造が作られる
                       DEMO
RoR の MVC
app/controllers   app/models

   Controller      Model


                    DB
      View

 app/views
Controller を動かす


勉強会参加者の管理アプリを作ってみ
ます

まずは Top Page でも


                  DEMO
URL, Controller, View
http://localhost:3000/top_page/index


         TopPageController

                     index
                    アクション
routes.rb


どのURLに対してどのコントローラの
どのアクションを呼び出すか定義

デフォルトの動作も定義されている
URLが設計に影響


Controller クラスをどう分割するか

RESTfulにするのに適した設計

モデルのCRUDとの自動対応
データベースの準備


データベースを作る

database.ymlを設定する
モデルを作る

「Seminar」クラスを作ろう

テーブル名は seminars

title, date, description を持つ

Migrationでテーブルを作る

モデルクラスを作る
                               DEMO
Controller, View と
  つなげて動かす
「Seminar」モデルのメンテナンスの
ためのコントローラ
「SeminarsController」を作る

簡単な登録フォームと一覧を作る


                     DEMO
Scaffold


このような定型的な処理には Scaffold
が利用できる

あくまでも開発のための足場であっ
て、完成品ではない

                   DEMO
ActiveScaffold


完成品にしちゃえばいいじゃない! 
というプラグイン

管理機能などに便利


                 DEMO
惑わされない

Rails というと Scaffold が有名

汎用的な実装を楽にするためのツール
に過ぎない

人は Scaffold のために作るにあらず

本当の価値は、総合的な生産効率
ActiveRecord


O/R マッピング

テーブル → クラス

レコード → インスタンス
ActiveRecordの
      使い方

登録する

検索する

設計する
Rails のコンソール

> ruby script/console

  Rails のライブラリがすべて使える状態
  のコンソール

  ちょっとした動作確認に便利

  これを使いつつ説明していきます
                        DEMO
レコードを登録する
seminar = Seminar.new(
  :title => 'Ruby on Rails 入門',
  :date => Date.today
)
seminar.save


  インスタンスを作って save する
                                  DEMO
Form から DBへ
画面
  <%= text_field :seminar, :title %>

          リクエストパラメータ
       {:seminar => {:title => 値}}

コントローラ

seminar = Seminar.new(params[:seminar])
バリデーション

save を呼ぶと、内部でバリデーション
メソッドが走る

空でないか? ユニークか? etc

違反があれば、保存されない

                    DEMO
登録の前後に
好きな処理を挟める
コールバック

before_save

before_validation

after_save

create専用、update専用もある
レコードを検索する
全件検索

  @seminars = Seminar.find(:all)

2008年開催のものを検索する

@seminars = Seminar.find(:all,
 :conditions => "date >= '2008-01-01'
    and date < '2009-01-01'")
                                   DEMO
find_by_xxx


 find_by_date など、カラムごとの検索
 メソッドが自動的に使えるようになる


today_seminars =
Seminar.find_by_date(Date.today)
                                  DEMO
join


find のオプションで :joins で JOIN句
をそのまま記述する

join したデータを後で使うなら、「関
連」を使うほうが楽
「関連」を使った検索

  「Seminar」には「Participant」(参
  加者)が複数いる

<% for p in seminar.participants %>
  ... 参加者情報の表示 ...
<% end %>

                                  DEMO
1 対 多の関連を張る
class Seminar < ActiveRecord::Base
 has_many :participants
end


class Participant < ActiveRecord::Base
 belongs_to :seminar
end
                                    DEMO
関連を使う
セミナーオブジェクトから参加者を得る

participants = seminar.participants

参加者オブジェクトからセミナーを得る

seminar = participant.seminar
関連の
     Eager Loading
Seminar.find(:all,
  :include => :participants)


 一度の検索で関連オブジェクトも取得

 デフォルトは Lazy Loading
count, max など


count = Seminar.count
last_date = Sminar.maxmum('date')
必要な情報だけを
      取得する
dates = Seminar.find(:all,
 :select => 'date')


  必要なカラムの情報だけを取得するこ
  ともできる

                            DEMO
SQLの
    チューニング

ActiveRecord が実際に使ったSQLは
開発ログに出る

それを見ながらチューニング

いざとなったらSQLを書く手も
モデルを設計する

オブジェクト指向とテーブル設計をいっ
たりきたりしながら最適なポイントを
探す

両者のギャップを埋めるための高度な
機能が存在
高度な機能


単一テーブル継承

ポリモーフィック関連
単一テーブル継承
            継承関係にある複数のクラスを

                         class



    table
                 class       class


1つのテーブルに対応づける
単一テーブル継承

テーブルの type カラムにクラス名が格
納される

操作対象のクラスによって、
ActiveRecord がよきにはからう

オブジェクト指向で作れる
ポリモーフィック関連


   *   1




複数のテーブル(=クラス)を、どれも
同じ関連であると見なす
ポリモーフィック関連


   *   1




複数のテーブル(=クラス)を、どれも
同じ関連であると見なす
ポリモーフィック関連
タグが


      *   1




複数のテーブル(=クラス)を、どれも
同じ関連であると見なす
ポリモーフィック関連
タグが       いろいろなものにつく


      *   1




複数のテーブル(=クラス)を、どれも
同じ関連であると見なす
ActiveRecord 凄い!

オブジェクト指向で開発できる

自由度が高い

規約どおりにつくればコード量がとて
も少なくて済む
RoR の開発現場


アジャイルがお奨め

モデル設計 → URL設計 → 実装

10人くらい参加しても大丈夫
ありがちな心配

コンパイル時のチェックがなくて品質
は大丈夫か?

分業しづらい?

大規模開発に向かない?

パフォーマンスが悪い?
案外大丈夫
テストをしっかりやれば品質は上げら
れる

オブジェクト指向に乗っ取れば分業は
まったく問題ない

大規模開発もできる

ただし、楽しくなくなるかも
パフォーマンス

何も気にせず作ると、かなり遅い

チューニング必須

キャッシュやDBまわりのチューニング
でかなり速くなる
テスト

Rails には 3種類のテストフレームワー
クが備わっている

Unit テストは使いやすい

コントローラ・ビューのテストは
Selenium が便利
Ruby, Rails の習得

Java経験者なら構文はすぐ習得

1ヶ月もすれば開発戦力に

らしい プログラムを書くには3ヶ月
くらいかかる
私の重視する開発習慣

コミュニケーション

名前づけの重視

DRY(同じコードを重複して書かな
い)の追求

まず仮定し、あとで調節する
RoRに必要な
    マインド

フレームワークに合わせる協調性

フレームワークを拡張する勇気

プラグインとの適切な距離感
Rails に合わせる

Rails の規約に従わないことは可能

大きなコストが伴う

できるだけ仕様をRailsに合わせること
が高い生産性を得るコツ
Rails に呑まれない

Rails にないからといって諦めない

Ruby も Rails も動作を上書きできる

何でもできる

勇気を持つ
やりすぎない

できるとやりたくなる

過ぎたるは及ばざるがごとし

改変ではなく拡張にとどめる

バランスが難しい
プラグイン

いろいろ使えるようになっておくと開
発がとても早い

ソースを読む覚悟で使う

国際化不足のものもある

Railsのバージョンアップがしづらく
なったりする
サービス紹介


Web家計簿「小槌」

BookScope

ImageUpload プラグイン
小槌




  http://www.kozuchi.net

ユーザー間の貸し借り連動記入など
BookScope




  http://bookscope.net

貸し借り管理のできる蔵書システム
ImageUpload
      プラグイン
http://imageupload.rubyforge.org/

伊藤忠商事 Tlab で開発

かっこよく画像をアップロードするプ
ラグイン
ご静聴ありがとうございました。


    ご指摘・ご質問等は
  y.ohba@everyleaf.com
    までお願いします。

Ruby on Rails 入門