Upload
nay
View
3.924
Download
2
Embed Size (px)
DESCRIPTION
2008-03-10 に club db2 にて行った Ruby on Rails 入門セミナーの資料です。
Citation preview
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
クラスの定義
Dog というクラスができます
class Dog
end
DEMO
インスタンスを作る
dog という変数ができます
Dog クラスのインスタンスが作られ、dog に代入されます
dog = Dog.new
DEMO
メソッドの定義
インスタンスメソッド say を定義する
class Dog def say p 'Baw!' endend
DEMO
メソッドを呼ぶ
dog の say メソッドを呼ぶ
dog = Dog.newdog.say
DEMO
引数のあるメソッド
def eat(food) if food p 'Thank you!' else p 'oooooo' end end DEMO
引数のあるメソッドを呼ぶ
dog = Dog.newdog.eat(100)
DEMO
メソッドの () の省略
省略してもわかるものは省略できる
書式の統一よりのびのびした使い勝手
自由 > 統制
dog = Dog.newdog.eat 100
DEMO
インスタンス変数
@がついた変数はインスタンス変数
外部から直接アクセスできない
class Dog def name=(name) @name = name endend
DEMO
クラスを調べてみる
継承元クラスを明示的に指定しないとObject クラスの派生クラスになる
dog.kind_of?(Dog)dog.kind_of?(Object)dog.kind_of?(String)p dog.class
DEMO
クラスの継承
Dog の派生クラス Sheltie を作る
class Sheltie < Dog def say p 'coon' endend
DEMO
すべてがオブジェクト
プリミティブ型という概念なし
クラスもオブジェクト
p 'Wow'.classp 100.classp Dog.class
DEMO
動的型づけ
型宣言なし
=すべての変数の型が Object であるのと一緒
型の整合性は気にしない
動作するかどうかだけが重要
文字列
Stringクラス
"..."では、#{}で評価結果を埋め込むことができる
"文字列です""その犬の種類は #{dog.class.name} です"
DEMO
文字コード
Ruby 1.8 では、文字列はバイト列
RoR では utf-8を使う
日本語の操作は正規表現万歳
Ruby 1.9 では国際化された
配列
リスト操作は基本的に配列を使う
a = Array.newa = []a = [1, 2, 3]p a[1]p a.size
DEMO
ハッシュ
RoRでは基本中の基本となるクラス
:id ・・・シンボル(Symbol)
h = Hash.newh = {}h = {:id => 1, :name => 'Pochi'}p[:id]p[:name]
DEMO
引数にハッシュを渡す
320円の肉を食べる
dog.eat( {:name => 'meat', :price => 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事始め~用意するもの~
Rails を Ruby 環境に入れる
Rails の最新バージョンは 2.0.2
DBを用意
IDE(Aptana, NetBeans etc)を用意
> gem install rails
アプリケーションを作る
IDE から New Project
コマンドラインなら次のようにする
> rails myapp
→プロジェクトで使うファイルやディレクトリ構造が作られる DEMO
RoR の MVC
ModelController
ViewDB
app/controllers
app/views
app/models
Controller を動かす
勉強会参加者の管理アプリを作ってみます
まずは Top Page でも
DEMO
URL, Controller, Viewhttp://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 のコンソール
Rails のライブラリがすべて使える状態のコンソール
ちょっとした動作確認に便利
これを使いつつ説明していきます
> ruby script/console
DEMO
レコードを登録する
インスタンスを作って save する
seminar = Seminar.new( :title => 'Ruby on Rails 入門', :date => Date.today)seminar.save
DEMO
Form から DBへ
<%= text_field :seminar, :title %>
seminar = Seminar.new(params[:seminar])
リクエストパラメータ{:seminar => {:title => 値}}
画面
コントローラ
バリデーション
save を呼ぶと、内部でバリデーションメソッドが走る
空でないか? ユニークか? etc
違反があれば、保存されない
DEMO
登録の前後に好きな処理を挟めるコールバック
before_save
before_validation
after_save
create専用、update専用もある
レコードを検索する
@seminars = Seminar.find(:all)
全件検索
@seminars = Seminar.find(:all, :conditions => "date >= '2008-01-01' and date < '2009-01-01'")
2008年開催のものを検索する
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 :participantsend
class Participant < ActiveRecord::Base belongs_to :seminarend
DEMO
関連を使う
participants = seminar.participants
seminar = participant.seminar
セミナーオブジェクトから参加者を得る
参加者オブジェクトからセミナーを得る
関連のEager Loading
一度の検索で関連オブジェクトも取得
デフォルトは Lazy Loading
Seminar.find(:all, :include => :participants)
count, max など
count = Seminar.countlast_date = Sminar.maxmum('date')
必要な情報だけを取得する
必要なカラムの情報だけを取得することもできる
dates = Seminar.find(:all, :select => 'date')
DEMO
SQLのチューニング
ActiveRecord が実際に使ったSQLは開発ログに出る
それを見ながらチューニング
いざとなったらSQLを書く手も
モデルを設計する
オブジェクト指向とテーブル設計をいったりきたりしながら最適なポイントを探す
両者のギャップを埋めるための高度な機能が存在
高度な機能
単一テーブル継承
ポリモーフィック関連
単一テーブル継承
table
class
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 プラグイン
ImageUploadプラグイン
http://imageupload.rubyforge.org/
伊藤忠商事 Tlab で開発
かっこよく画像をアップロードするプラグイン
ご静聴ありがとうございました。
ご指摘・ご質問等は[email protected]までお願いします。