91
Ruby on Rails 入門 2008. 3. 10 株式会社万葉 大場寧子

Ruby on Rails 入門

  • Upload
    nay

  • View
    3.924

  • Download
    2

Embed Size (px)

DESCRIPTION

2008-03-10 に club db2 にて行った Ruby on Rails 入門セミナーの資料です。

Citation preview

Page 1: Ruby on Rails 入門

Ruby on Rails 入門

2008. 3. 10株式会社万葉 大場寧子

Page 2: Ruby on Rails 入門

自己紹介

実装大好きプログラマ

Award on Rails 2006 大賞受賞

Ruby歴2年

会社を作りました

Page 3: Ruby on Rails 入門

デブサミ後の飲み会にて

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

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

Page 4: Ruby on Rails 入門

Ruby on Rails

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

Ruby

オールインワン

Page 5: Ruby on Rails 入門

RoRとの出会い

2006年春

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

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

Page 6: Ruby on Rails 入門

RoRとの出会い

2006年春

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

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

断られた

Page 7: Ruby on Rails 入門

ふてくされる

ミドルウェア苦手です

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

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

・・・・しぶしぶ手をつける

Page 8: Ruby on Rails 入門

RoR ってスゴイ!

スイスイ作れる

実は本格的

かゆいところに手が届く

Page 9: Ruby on Rails 入門

楽しい!

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

旦那が、Award on Rails を薦める

大賞・審査員特別賞を頂戴する

Page 10: Ruby on Rails 入門

ずっと RoR

業務でもRuby on Rails

ECサイト

SNS

医事会計

地球の歩き方 旅すけ

Page 11: Ruby on Rails 入門

今日のお題

Ruby ってどんなカンジ?

Ruby on Rails の雰囲気をつかむ

ActiveRecord について少し詳しく

実際に現場で使っての感想

Page 12: Ruby on Rails 入門

時間配分

Ruby - 10分

Ruby on Rails - 30分

ActiveRecord - 20分

現場 - 5分

Page 13: Ruby on Rails 入門

Ruby ってどんなカンジ?

とてもイイ

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

Rails に行く前に軽く説明します

Page 14: Ruby on Rails 入門

Ruby 事始め用意するもの

Ruby, RubyGem

RoR 対応バージョンは 1.8

Windows なら One-Click Installer

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

Page 15: Ruby on Rails 入門

irb

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

> irb

これを使いながらRubyの動作を説明していきます。 DEMO

Page 16: Ruby on Rails 入門

クラスの定義

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

class Dog

end

DEMO

Page 17: Ruby on Rails 入門

インスタンスを作る

dog という変数ができます

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

dog = Dog.new

DEMO

Page 18: Ruby on Rails 入門

メソッドの定義

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

class Dog def say p 'Baw!' endend

DEMO

Page 19: Ruby on Rails 入門

メソッドを呼ぶ

dog の say メソッドを呼ぶ

dog = Dog.newdog.say

DEMO

Page 20: Ruby on Rails 入門

引数のあるメソッド

def eat(food) if food p 'Thank you!' else p 'oooooo' end end DEMO

Page 21: Ruby on Rails 入門

引数のあるメソッドを呼ぶ

dog = Dog.newdog.eat(100)

DEMO

Page 22: Ruby on Rails 入門

メソッドの () の省略

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

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

自由 > 統制

dog = Dog.newdog.eat 100

DEMO

Page 23: Ruby on Rails 入門

インスタンス変数

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

外部から直接アクセスできない

class Dog def name=(name) @name = name endend

DEMO

Page 24: Ruby on Rails 入門

クラスを調べてみる

継承元クラスを明示的に指定しないとObject クラスの派生クラスになる

dog.kind_of?(Dog)dog.kind_of?(Object)dog.kind_of?(String)p dog.class

DEMO

Page 25: Ruby on Rails 入門

クラスの継承

Dog の派生クラス Sheltie を作る

class Sheltie < Dog def say p 'coon' endend

DEMO

Page 26: Ruby on Rails 入門

すべてがオブジェクト

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

クラスもオブジェクト

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

DEMO

Page 27: Ruby on Rails 入門

動的型づけ

型宣言なし

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

型の整合性は気にしない

動作するかどうかだけが重要

Page 28: Ruby on Rails 入門

文字列

Stringクラス

"..."では、#{}で評価結果を埋め込むことができる

"文字列です""その犬の種類は #{dog.class.name} です"

DEMO

Page 29: Ruby on Rails 入門

文字コード

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

RoR では utf-8を使う

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

Ruby 1.9 では国際化された

Page 30: Ruby on Rails 入門

配列

リスト操作は基本的に配列を使う

a = Array.newa = []a = [1, 2, 3]p a[1]p a.size

DEMO

Page 31: Ruby on Rails 入門

ハッシュ

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

:id ・・・シンボル(Symbol)

h = Hash.newh = {}h = {:id => 1, :name => 'Pochi'}p[:id]p[:name]

DEMO

Page 32: Ruby on Rails 入門

引数にハッシュを渡す

320円の肉を食べる

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

DEMO

Page 33: Ruby on Rails 入門

ハッシュの{ }の省略

任意のオプションを引数として渡すのに多用される

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

DEMO

Page 34: Ruby on Rails 入門

null じゃなくて nil

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

0 も false ではない

Page 35: Ruby on Rails 入門

あとのことは

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

http://www.ruby-lang.org/ja/man/html/index.html

Page 36: Ruby on Rails 入門

RoR事始め~用意するもの~

Rails を Ruby 環境に入れる

Rails の最新バージョンは 2.0.2

DBを用意

IDE(Aptana, NetBeans etc)を用意

> gem install rails

Page 37: Ruby on Rails 入門

アプリケーションを作る

IDE から New Project

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

> rails myapp

→プロジェクトで使うファイルやディレクトリ構造が作られる DEMO

Page 38: Ruby on Rails 入門

RoR の MVC

ModelController

ViewDB

app/controllers

app/views

app/models

Page 39: Ruby on Rails 入門

Controller を動かす

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

まずは Top Page でも

DEMO

Page 40: Ruby on Rails 入門

URL, Controller, Viewhttp://localhost:3000/top_page/index

TopPageController

index アクション

Page 41: Ruby on Rails 入門

routes.rb

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

デフォルトの動作も定義されている

Page 42: Ruby on Rails 入門

URLが設計に影響

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

RESTfulにするのに適した設計

モデルのCRUDとの自動対応

Page 43: Ruby on Rails 入門

データベースの準備

データベースを作る

database.ymlを設定する

Page 44: Ruby on Rails 入門

モデルを作る

「Seminar」クラスを作ろう

テーブル名は seminars

title, date, description を持つ

Migrationでテーブルを作る

モデルクラスを作るDEMO

Page 45: Ruby on Rails 入門

Controller, View とつなげて動かす

「Seminar」モデルのメンテナンスのためのコントローラ「SeminarsController」を作る

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

DEMO

Page 46: Ruby on Rails 入門

Scaffold

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

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

DEMO

Page 47: Ruby on Rails 入門

ActiveScaffold

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

管理機能などに便利

DEMO

Page 48: Ruby on Rails 入門

惑わされない

Rails というと Scaffold が有名

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

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

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

Page 49: Ruby on Rails 入門

ActiveRecord

O/R マッピング

テーブル → クラス

レコード → インスタンス

Page 50: Ruby on Rails 入門

ActiveRecordの使い方

登録する

検索する

設計する

Page 51: Ruby on Rails 入門

Rails のコンソール

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

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

これを使いつつ説明していきます

> ruby script/console

DEMO

Page 52: Ruby on Rails 入門

レコードを登録する

インスタンスを作って save する

seminar = Seminar.new( :title => 'Ruby on Rails 入門', :date => Date.today)seminar.save

DEMO

Page 53: Ruby on Rails 入門

Form から DBへ

<%= text_field :seminar, :title %>

seminar = Seminar.new(params[:seminar])

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

画面

コントローラ

Page 54: Ruby on Rails 入門

バリデーション

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

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

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

DEMO

Page 55: Ruby on Rails 入門

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

before_save

before_validation

after_save

create専用、update専用もある

Page 56: Ruby on Rails 入門

レコードを検索する

@seminars = Seminar.find(:all)

全件検索

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

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

DEMO

Page 57: Ruby on Rails 入門

find_by_xxx

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

today_seminars = Seminar.find_by_date(Date.today)

DEMO

Page 58: Ruby on Rails 入門

join

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

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

Page 59: Ruby on Rails 入門

「関連」を使った検索

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

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

DEMO

Page 60: Ruby on Rails 入門

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

class Participant < ActiveRecord::Base belongs_to :seminarend

DEMO

Page 61: Ruby on Rails 入門

関連を使う

participants = seminar.participants

seminar = participant.seminar

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

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

Page 62: Ruby on Rails 入門

関連のEager Loading

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

デフォルトは Lazy Loading

Seminar.find(:all, :include => :participants)

Page 63: Ruby on Rails 入門

count, max など

count = Seminar.countlast_date = Sminar.maxmum('date')

Page 64: Ruby on Rails 入門

必要な情報だけを取得する

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

dates = Seminar.find(:all, :select => 'date')

DEMO

Page 65: Ruby on Rails 入門

SQLのチューニング

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

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

いざとなったらSQLを書く手も

Page 66: Ruby on Rails 入門

モデルを設計する

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

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

Page 67: Ruby on Rails 入門

高度な機能

単一テーブル継承

ポリモーフィック関連

Page 68: Ruby on Rails 入門

単一テーブル継承

table

class

class class

継承関係にある複数のクラスを

1つのテーブルに対応づける

Page 69: Ruby on Rails 入門

単一テーブル継承

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

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

オブジェクト指向で作れる

Page 70: Ruby on Rails 入門

ポリモーフィック関連

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

1*

Page 71: Ruby on Rails 入門

ポリモーフィック関連

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

1*

Page 72: Ruby on Rails 入門

ポリモーフィック関連

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

1*

タグが

Page 73: Ruby on Rails 入門

ポリモーフィック関連

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

1*

タグが いろいろなものにつく

Page 74: Ruby on Rails 入門

ActiveRecord 凄い!

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

自由度が高い

規約どおりにつくればコード量がとても少なくて済む

Page 75: Ruby on Rails 入門

RoR の開発現場

アジャイルがお奨め

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

10人くらい参加しても大丈夫

Page 76: Ruby on Rails 入門

ありがちな心配

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

分業しづらい?

大規模開発に向かない?

パフォーマンスが悪い?

Page 77: Ruby on Rails 入門

案外大丈夫テストをしっかりやれば品質は上げられる

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

大規模開発もできる

ただし、楽しくなくなるかも

Page 78: Ruby on Rails 入門

パフォーマンス

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

チューニング必須

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

Page 79: Ruby on Rails 入門

テスト

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

Unit テストは使いやすい

コントローラ・ビューのテストは Selenium が便利

Page 80: Ruby on Rails 入門

Ruby, Rails の習得

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

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

’らしい’ プログラムを書くには3ヶ月くらいかかる

Page 81: Ruby on Rails 入門

私の重視する開発習慣

コミュニケーション

名前づけの重視

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

まず仮定し、あとで調節する

Page 82: Ruby on Rails 入門

RoRに必要なマインド

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

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

プラグインとの適切な距離感

Page 83: Ruby on Rails 入門

Rails に合わせる

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

大きなコストが伴う

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

Page 84: Ruby on Rails 入門

Rails に呑まれない

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

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

何でもできる

勇気を持つ

Page 85: Ruby on Rails 入門

やりすぎない

できるとやりたくなる

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

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

バランスが難しい

Page 86: Ruby on Rails 入門

プラグイン

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

ソースを読む覚悟で使う

国際化不足のものもある

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

Page 87: Ruby on Rails 入門

サービス紹介

Web家計簿「小槌」

BookScope

ImageUpload プラグイン

Page 88: Ruby on Rails 入門

小槌

http://www.kozuchi.net

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

Page 89: Ruby on Rails 入門

BookScope

http://bookscope.net

貸し借り管理のできる蔵書システム

Page 90: Ruby on Rails 入門

ImageUploadプラグイン

http://imageupload.rubyforge.org/

伊藤忠商事 Tlab で開発

かっこよく画像をアップロードするプラグイン

Page 91: Ruby on Rails 入門

ご静聴ありがとうございました。

ご指摘・ご質問等は[email protected]までお願いします。