Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Ruby on Railsによる
Webアプリケーション開発
島根大学
2008-12-12
大場寧子
株式会社万葉
大場光一郎
伊藤忠テクノソリューションズ株式会社
1
自己紹介
•大場寧子
•大場光一郎
2
RoR逆引きクイックリファレンス
•大場寧子
•大場光一郎
•久保優子
毎日コミュニケーションズ
3
今日の課題
•掲示板システムの開発
•TDD(テスト駆動開発)
•Scaffoldを使わない
•RESTful
4
必要な作業
•プロジェクトの作成
•データベースの作成
•テストの書き方を覚える
•モデル(掲示板記事)の実装
5
bbsプロジェクトの作成
•デフォルトではデータ
ベースとしてsqlite3が選
択される。-dオプション
でmysqlを指定する
> rails -d mysql bbs
6
データベースを作る
> rake db:create
•※mysqladmin で
bbs_developmentを作るのと同じ
•Rails 2.0 で追加された便利なタスク
7
要件を考える
•一種類だけの掲示板
•上部に投稿フォーム
•ポストした記事が新
しい順に表示される
•指定した記事を削除
できる
入力欄
投稿
8
モデル設計
入力欄
投稿
記事
(Entry)
•投稿者の名前
•投稿日時
•本文
9
モデルの作成
(1)generateスクリプトでモデ
ル、ユニットテスト、マイグ
レーションを作成
(2)マイグレーションを実行
10
generateコマンドで
モデルを作成する
モデルクラス、テストファ
イル、マイグレーション
ファイルが作成される
> ruby script/generate model Entry
user_name:string body:text
11
マイグレーションとは
•データベースへの変更を、変更
のたびにRubyコードで記述し
て保存しておく
•開発者全員で共有できる
12
生成されたマイグレーション
db/migrate/
20081212XXXXXX_create_entries.rb
class CreateEntries < ActiveRecord::Migration
def self.up
creat...
マイグレーションの
実行
•バージョンを上げる
> rake db:migrate
•バージョンを下げて上げる(最後のマイ
グレーションファイルを実行しなおす)
> rake db:migrate:redo
14
モデルが作成できたので
•次は実装(コードを書く)
•本当に実装するまえに、満たす
べき理想の動作(仕様)をテス
トに書く
15
Railsのテスト
•3種類のテストがある
•ユニットテスト
•ファンクショナルテスト
•インテグレーションテスト
16
テストの実行
•テストDBを作成する
> rake db:create RAILS_ENV=test
•ユニットテストを実行する
> rake test:units
17
テストの成功
•tests - テストメソッドの数
•assertions - アサーションの数
•failures - 想定と違う結果になった数
•errors - エラー(例外)発生数
1 tests, 1 assertions, 0 fa...
アサーション
•assertする=強く断言する
•あるべき動作を記述
•違反したら知らせてくれる
assert foo
fooはtrueのはず
assert_equal 3, foo
fooは3のはず
19
デフォルトの
ユニットテストコード
require 'test_helper'
class EntryTest < ActiveSupport::TestCase
# Replace this with your real tests.
def...
Entryモデルの
本当のテストを書こう
•満たすべき仕様
•本文が空なら検証エラーとな
ること
21
検証とは
•モデルがデータベースに登録される前に、
属性(Attribute)の値が正しいかチェッ
クすること
•検証エラーになったら、保存されない
•Railsが便利な仕組みを提供
22
検証は保存前に
自動的に行われる
属性の代入
検証
保存
属性の代入
失敗
falseを返す
save
成功
trueを返す
23
Entryの検証
•本文が空のとき検証エラーとなる
•body属性の中身が ならsaveメソッドの返
り値がfalseになること
entry = Entry.new(
:user_name => "太郎 ", :body => "")
entr...
テストを書こう
require 'test_helper'
class EntryTest < ActiveSupport::TestCase
# Replace this with your real tests.
def test_trut...
テストを書こう
require 'test_helper'
class EntryTest < ActiveSupport::TestCase
def test_empty_body
entry = Entry.new(
:user_name ...
テストの失敗
まだEntryの検証を実装していないので、こ
のテストは failure となるはず。
つまり、bodyが空文字でもデータベースに保
存できてしまっている。
1 tests, 1 assertions, 1 failures, 0...
テストが通るように
モデルの検証を実装しよう
•bodyが空文字(またはnil)なら検証で失敗
して保存されないようにする
class Entry < ActiveRecord::Base
validates_presence_of :body...
実装したら
もう一度テストを実行
•成功!
1 tests, 1 assertions, 0 failures, 0 errors
29
テスト駆動開発
新機能の
テストを書く
(失敗する)
新機能を
実装する
テストが
成功する
30
TDDのメリット
•リズミカルな開発
•コードをメンテナンスしやすい
•コードを変更したとき、不具合が発生し
ていないかチェックできる
•仕様(正しい動作)を理解しやすい
31
掲示板を作ろう(続き)
•モデルは用意した
•コントローラとビューを作ろう
32
コントローラの設計
•なにごとも設計から
•コントローラの設計は、URL
の設計
•掲示板システムのあるべき
URLとは?
33
掲示板のURL
入力フォームと記事一覧
/entries/index
記事の投稿
/entries/create
・・・このスタイルはもう古い
34
HTTPメソッド
•HTTPには4つのメソッドがある
•GET
•POST
•PUT
•DELETE
35
URL+メソッド
GET /entries/3
記事3を取得する
DELETE /enrteis/3
記事3を削除する
PUT /entries/3
記事3を変更する
36
RESTful
•URLは「リソース」を表す
•例えば「記事」がリソース
•HTTPメソッドは動詞を表す
•美しいURL
•統一的なI/F
37
RESTfulな
掲示板システム
入力フォームと記事一覧
GET /entries
記事の投稿
POST /entries
38
コントローラ・アクション
とのマッピング
•Railsでは routes.rb
に指定
ActionController::Routing::Routes.draw do ¦map¦
map.resouces :entries
end
39
map.resources :entries
意味
HTTP
メソッド
URL アクション
一覧 GET /entries index
登録フォーム表示 GET /entries/new new
登録 POST /entries create
...
URLの生成
•map.resourcesによって、専用のURL生
成メソッドが用意される
URL URLを生成する専用メソッド
/entries entries_path
/entries/new new_entry_path
/entrie...
我々の課題では
意味
HTTP
メソッド
URL アクション
一覧と
登録フォーム表示
GET /entries index
登録 POST /entries create
IDが17の記事を削除 DELETE /entries/17 dest...
コントローラの作成
> ruby script/generate
controller entries index create
destroy
記事を一覧、投稿、削除するためのコントロー
ラをアクション付きで作成します
43
演習
1.index アクションと画面を実装する
2.create アクションを実装する
3.destroy アクションを実装する(余裕が
ある人のみ)
44
参考URL
•Rails APIリファレンス
•http://api.rubyonrails.org/
•Ruby リファレンス
•http://www.ruby-lang.org/ja/
man/
45
あとは
•自由につくってかまいません
•この後のヒントを参考にしてください
•講師を呼んで聞いてください
•やり方がわからない
•エラーが出てわからない
•何が分からないのか分からない
•なぜ動いているのか分からない etc...
46
ヒント
47
indexアクション
•データベースからEntryモデルの
リスト@entriesを投稿日時の新
しい順に取得
•投稿フォームのための新しい
Entryオブジェクトを@entryと
して用意する
48
投稿日時順の取得
@entries = Entry.find(:all,
:order => "created_at desc")
検索時に、:order オプションで順序を指定する。
大きい順(降順)なら desc を指定する。
49
index.html.erb
(一覧&投稿画面)
•HTMLとしての体裁
•上部に@entryを利用した投稿
フォーム
•下部に@entriesを利用した一覧
の表示
50
index.html.erb の構造の例
<html>
<body>
<% form_for :entry do -%>
...... 投稿フォーム ......
<% end -%>
<% for entry in @entries do -...
createアクション
•ユーザー名・本文をリクエストか
ら取得
•Entryオブジェクトを作成
•データベースに保存(検証失敗な
ら保存されない)
•index画面にリダイレクト
52
削除機能
•index.html.erbで、削除アクションの
ためのリンクを記事ごとに張っておく
•destroyアクションで指定された記事を
削除して、index画面にリダイレクト
link_to "削除", entry_path(entry...
まとめ
•開発手法のひとつとしてTDDがある
•Railsにはテストフレームワークが含まれて
いる
•最近のWebアプリケーションではRESTful
という考え方がある
•RailsはRESTfulを強力にサポート
54
Upcoming SlideShare
Loading in …5
×

Shimane2008

1,627 views

Published on

Presentation of a seminar in Shimane Univ.

Published in: Technology
  • Be the first to comment

Shimane2008

  1. 1. Ruby on Railsによる Webアプリケーション開発 島根大学 2008-12-12 大場寧子 株式会社万葉 大場光一郎 伊藤忠テクノソリューションズ株式会社 1
  2. 2. 自己紹介 •大場寧子 •大場光一郎 2
  3. 3. RoR逆引きクイックリファレンス •大場寧子 •大場光一郎 •久保優子 毎日コミュニケーションズ 3
  4. 4. 今日の課題 •掲示板システムの開発 •TDD(テスト駆動開発) •Scaffoldを使わない •RESTful 4
  5. 5. 必要な作業 •プロジェクトの作成 •データベースの作成 •テストの書き方を覚える •モデル(掲示板記事)の実装 5
  6. 6. bbsプロジェクトの作成 •デフォルトではデータ ベースとしてsqlite3が選 択される。-dオプション でmysqlを指定する > rails -d mysql bbs 6
  7. 7. データベースを作る > rake db:create •※mysqladmin で bbs_developmentを作るのと同じ •Rails 2.0 で追加された便利なタスク 7
  8. 8. 要件を考える •一種類だけの掲示板 •上部に投稿フォーム •ポストした記事が新 しい順に表示される •指定した記事を削除 できる 入力欄 投稿 8
  9. 9. モデル設計 入力欄 投稿 記事 (Entry) •投稿者の名前 •投稿日時 •本文 9
  10. 10. モデルの作成 (1)generateスクリプトでモデ ル、ユニットテスト、マイグ レーションを作成 (2)マイグレーションを実行 10
  11. 11. generateコマンドで モデルを作成する モデルクラス、テストファ イル、マイグレーション ファイルが作成される > ruby script/generate model Entry user_name:string body:text 11
  12. 12. マイグレーションとは •データベースへの変更を、変更 のたびにRubyコードで記述し て保存しておく •開発者全員で共有できる 12
  13. 13. 生成されたマイグレーション db/migrate/ 20081212XXXXXX_create_entries.rb class CreateEntries < ActiveRecord::Migration def self.up create_table :entries do ¦t¦ t.string user_name t.text body t.timestamps end end def self.down drop_table :entries end end 投稿者を格納する user_nameカラム 本文を格納する bodyカラム バージョン アップ (テーブル 作成) バージョ ンダウン (テーブ ル削除) 13
  14. 14. マイグレーションの 実行 •バージョンを上げる > rake db:migrate •バージョンを下げて上げる(最後のマイ グレーションファイルを実行しなおす) > rake db:migrate:redo 14
  15. 15. モデルが作成できたので •次は実装(コードを書く) •本当に実装するまえに、満たす べき理想の動作(仕様)をテス トに書く 15
  16. 16. Railsのテスト •3種類のテストがある •ユニットテスト •ファンクショナルテスト •インテグレーションテスト 16
  17. 17. テストの実行 •テストDBを作成する > rake db:create RAILS_ENV=test •ユニットテストを実行する > rake test:units 17
  18. 18. テストの成功 •tests - テストメソッドの数 •assertions - アサーションの数 •failures - 想定と違う結果になった数 •errors - エラー(例外)発生数 1 tests, 1 assertions, 0 failures, 0 errors 18
  19. 19. アサーション •assertする=強く断言する •あるべき動作を記述 •違反したら知らせてくれる assert foo fooはtrueのはず assert_equal 3, foo fooは3のはず 19
  20. 20. デフォルトの ユニットテストコード require 'test_helper' class EntryTest < ActiveSupport::TestCase # Replace this with your real tests. def test_truth assert true end end 必ず成功するダミーのテストが 自動生成されている test/unit/entry_test.rb trueは必ずtrue 常にアサーションどおり 20
  21. 21. Entryモデルの 本当のテストを書こう •満たすべき仕様 •本文が空なら検証エラーとな ること 21
  22. 22. 検証とは •モデルがデータベースに登録される前に、 属性(Attribute)の値が正しいかチェッ クすること •検証エラーになったら、保存されない •Railsが便利な仕組みを提供 22
  23. 23. 検証は保存前に 自動的に行われる 属性の代入 検証 保存 属性の代入 失敗 falseを返す save 成功 trueを返す 23
  24. 24. Entryの検証 •本文が空のとき検証エラーとなる •body属性の中身が ならsaveメソッドの返 り値がfalseになること entry = Entry.new( :user_name => "太郎 ", :body => "") entry.save # ←この返り値がfalseになってほしい 24
  25. 25. テストを書こう require 'test_helper' class EntryTest < ActiveSupport::TestCase # Replace this with your real tests. def test_truth assert true end end デフォルトのテスト コードを削除する 25
  26. 26. テストを書こう require 'test_helper' class EntryTest < ActiveSupport::TestCase def test_empty_body entry = Entry.new( :user_name => "太郎 ", :body => ""); assert_equal false, entry.save end end 追加 26
  27. 27. テストの失敗 まだEntryの検証を実装していないので、こ のテストは failure となるはず。 つまり、bodyが空文字でもデータベースに保 存できてしまっている。 1 tests, 1 assertions, 1 failures, 0 errors 27
  28. 28. テストが通るように モデルの検証を実装しよう •bodyが空文字(またはnil)なら検証で失敗 して保存されないようにする class Entry < ActiveRecord::Base validates_presence_of :body end 28
  29. 29. 実装したら もう一度テストを実行 •成功! 1 tests, 1 assertions, 0 failures, 0 errors 29
  30. 30. テスト駆動開発 新機能の テストを書く (失敗する) 新機能を 実装する テストが 成功する 30
  31. 31. TDDのメリット •リズミカルな開発 •コードをメンテナンスしやすい •コードを変更したとき、不具合が発生し ていないかチェックできる •仕様(正しい動作)を理解しやすい 31
  32. 32. 掲示板を作ろう(続き) •モデルは用意した •コントローラとビューを作ろう 32
  33. 33. コントローラの設計 •なにごとも設計から •コントローラの設計は、URL の設計 •掲示板システムのあるべき URLとは? 33
  34. 34. 掲示板のURL 入力フォームと記事一覧 /entries/index 記事の投稿 /entries/create ・・・このスタイルはもう古い 34
  35. 35. HTTPメソッド •HTTPには4つのメソッドがある •GET •POST •PUT •DELETE 35
  36. 36. URL+メソッド GET /entries/3 記事3を取得する DELETE /enrteis/3 記事3を削除する PUT /entries/3 記事3を変更する 36
  37. 37. RESTful •URLは「リソース」を表す •例えば「記事」がリソース •HTTPメソッドは動詞を表す •美しいURL •統一的なI/F 37
  38. 38. RESTfulな 掲示板システム 入力フォームと記事一覧 GET /entries 記事の投稿 POST /entries 38
  39. 39. コントローラ・アクション とのマッピング •Railsでは routes.rb に指定 ActionController::Routing::Routes.draw do ¦map¦ map.resouces :entries end 39
  40. 40. map.resources :entries 意味 HTTP メソッド URL アクション 一覧 GET /entries index 登録フォーム表示 GET /entries/new new 登録 POST /entries create IDが17の記事を表示 GET /entries/17 show IDが17の記事の 変更フォーム表示 GET /entries/17/edit edit IDが17の記事を変更 PUT /entries/17 update IDが17の記事を削除 DELETE /entries/17 destroy コントローラ:EntriesController 40
  41. 41. URLの生成 •map.resourcesによって、専用のURL生 成メソッドが用意される URL URLを生成する専用メソッド /entries entries_path /entries/new new_entry_path /entries/17 entry_path(entry) /entries/17/edit edit_entry_path(entry) link_to "掲示板はこちら", :controller => "entries", :action => "index" link_to "掲示板はこちら", entries_path 41
  42. 42. 我々の課題では 意味 HTTP メソッド URL アクション 一覧と 登録フォーム表示 GET /entries index 登録 POST /entries create IDが17の記事を削除 DELETE /entries/17 destroy 上記の範囲だけを意識して作っていきます 42
  43. 43. コントローラの作成 > ruby script/generate controller entries index create destroy 記事を一覧、投稿、削除するためのコントロー ラをアクション付きで作成します 43
  44. 44. 演習 1.index アクションと画面を実装する 2.create アクションを実装する 3.destroy アクションを実装する(余裕が ある人のみ) 44
  45. 45. 参考URL •Rails APIリファレンス •http://api.rubyonrails.org/ •Ruby リファレンス •http://www.ruby-lang.org/ja/ man/ 45
  46. 46. あとは •自由につくってかまいません •この後のヒントを参考にしてください •講師を呼んで聞いてください •やり方がわからない •エラーが出てわからない •何が分からないのか分からない •なぜ動いているのか分からない etc... 46
  47. 47. ヒント 47
  48. 48. indexアクション •データベースからEntryモデルの リスト@entriesを投稿日時の新 しい順に取得 •投稿フォームのための新しい Entryオブジェクトを@entryと して用意する 48
  49. 49. 投稿日時順の取得 @entries = Entry.find(:all, :order => "created_at desc") 検索時に、:order オプションで順序を指定する。 大きい順(降順)なら desc を指定する。 49
  50. 50. index.html.erb (一覧&投稿画面) •HTMLとしての体裁 •上部に@entryを利用した投稿 フォーム •下部に@entriesを利用した一覧 の表示 50
  51. 51. index.html.erb の構造の例 <html> <body> <% form_for :entry do -%> ...... 投稿フォーム ...... <% end -%> <% for entry in @entries do -%> ....... 1件ずつ記事を表示 ....... <% end -%> </body> </html> 51
  52. 52. createアクション •ユーザー名・本文をリクエストか ら取得 •Entryオブジェクトを作成 •データベースに保存(検証失敗な ら保存されない) •index画面にリダイレクト 52
  53. 53. 削除機能 •index.html.erbで、削除アクションの ためのリンクを記事ごとに張っておく •destroyアクションで指定された記事を 削除して、index画面にリダイレクト link_to "削除", entry_path(entry), :method => :delete 53
  54. 54. まとめ •開発手法のひとつとしてTDDがある •Railsにはテストフレームワークが含まれて いる •最近のWebアプリケーションではRESTful という考え方がある •RailsはRESTfulを強力にサポート 54

×