関西Ruby会議02                続・現場で役立つ                Ruby on Rails                   パターン                 (株)万葉 大場寧子         ...
関西Ruby会議02                          続                •Ruby会議2009                •Pragmatic Patterns of                 Rub...
関西Ruby会議02                     自己紹介                •プログラマ                •Rails アプリケーションを開発                • Akasaka.rb   ...
提供                株式会社   万葉                Everyleaf Corp.2009年11月7日土曜日
関西Ruby会議02                  Ruby on Rails                逆引きクイックリファレンス                                株式会社万葉2009年11月7日土曜日
関西Ruby会議02                サイン会                やります                       株式会社万葉2009年11月7日土曜日
関西Ruby会議02                   作ってるもの                •Web家計簿「小槌」                •iPhoneアプリ「iCarta」                • プラグイン類  ...
関西Ruby会議02                Web家計簿「小槌」                • http://www.kozuchi.net                • http://github.com/everyleaf/...
関西Ruby会議02                iCarta                             株式会社万葉2009年11月7日土曜日
関西Ruby会議02                      プラグイン                    http://github.com/nay                •html5jp_graphs             ...
関西Ruby会議02                   ナレジオン                http://knowledgeon.com/                   (株)ユーフィット                    グ...
関西Ruby会議02                    ナレジオンの特徴                •                ひととおりの機能の揃ったグ                ループウェア                ...
関西Ruby会議02                Railsにしては                 人数の多い                  開発体制                 (10人強)                    ...
関西Ruby会議02                    Rubyでの開発                •少人数が「勝ち」と言われる                                株式会社万葉2009年11月7日土曜日
関西Ruby会議02                    必要なら仕方ない                •   短期間に多くの機能                •   並行開発                               ...
関西Ruby会議02                  開発体制を工夫                •アジャイルっぽく                • ペアプログラミング                • 分担を固定しない         ...
関西Ruby会議02                  合意作りが大事                •大事なことは合意を作る                •書いておく                • 合意≠遵守              ...
関西Ruby会議02                 そうした現場で                気づいた技術ネタを                  今日喋ります                           株式会社万葉2009年1...
関西Ruby会議02                Ruby会議2009                 で話したことの                     おさらい                            株式会社万葉200...
関西Ruby会議02                アプリケーションが                  大きく複雑に                    なると                           株式会社万葉2009年11...
関西Ruby会議02                メンテナンスが                 大変になる                         株式会社万葉2009年11月7日土曜日
関西Ruby会議02                色々な人間が                コードを触る                         株式会社万葉2009年11月7日土曜日
関西Ruby会議02                  人によって                書き方が違ったり                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                変更しづらくなる                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                変更できることは大事                •小さくはじめられる                •素早いサービスの開始                • 後から育てられる       ...
関西Ruby会議02                さらに                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                 Rails案件                Rails技術者の                    増加                            株式会社万葉2009年11...
関西Ruby会議02                メンテナンスすべき                Railsプロジェクト                     の増加                             株式会社万葉2...
関西Ruby会議02                変更しやすさを                  維持する                仕組みが必要!                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                それには?                        株式会社万葉2009年11月7日土曜日
関西Ruby会議02                コードを良い状態に                 保つことが重要                           株式会社万葉2009年11月7日土曜日
関西Ruby会議02                    良い状態                •いい設計                •読みやすい、わかりやすい                •間違いにすぐ気づく            ...
関西Ruby会議02                そこで実装パターン                •Rails における実装パターンを                見つけ出し、共有する                •          ...
関西Ruby会議02                    具体的には                •ARオブジェクトから検索を始める                •ARオブジェクトをフィルターで得る                •ビジネ...
関西Ruby会議02                 ということを                Ruby会議2009で                  話しました :)                              株式会社万葉...
関西Ruby会議02                本題                         株式会社万葉2009年11月7日土曜日
関西Ruby会議02                     今日の話                1.本当は奥が深い検証の話                2.RESTfulとの付き合い方                          ...
関西Ruby会議02                    その前に                •                Rubyをよく使っている                人?                •        ...
関西Ruby会議02                1. 本当は奥が深い                検証     の話                            株式会社万葉2009年11月7日土曜日
関西Ruby会議02                Rails の検証は                良くできている                        save                入力    検証     保存    ...
関西Ruby会議02                  コード例:モデル                class Book < ActiveRecord::Base                  validates_presence_of...
関西Ruby会議02                   コード例:画面                <%= error_messages_for :book %>                                       ...
関西Ruby会議02                任意の検証が書ける                validate :check_title                private                def check_t...
関西Ruby会議02                    とても便利                •豊富な検証メソッド                •自由に追加できる                • エラーメッセージを扱える      ...
関西Ruby会議02                しかし                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02             最初の印象よりも               奥が深い                        株式会社万葉2009年11月7日土曜日
関西Ruby会議02                 私の遭遇した課題                •乱用されることがある                • 検証ニーズが場面によって違う                場合に困っている人を見か...
関西Ruby会議02                  検証についての                    課題                1)何を「検証」すればいいのか                2)場面によって検証ニーズが違う  ...
関西Ruby会議02                  1)何を                「検証」すれば                  いいのか                         株式会社万葉2009年11月7日土曜日
関西Ruby会議02                    Rails の                ActiveRecord の                「検証」とは?                                ...
関西Ruby会議02                  一般的な定義                 ActiveRecord                  オブジェクトが                  不正な状態で          ...
関西Ruby会議02                いいえ                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                   私の定義                 ActiveRecord                  オブジェクトが                ユーザーに許可された         ...
関西Ruby会議02                ユーザーに                許可された                操作によって                        株式会社万葉2009年11月7日土曜日
関西Ruby会議02                Railsの検証の失敗は、                予期された、                ユーザーに対して丁寧に対                応すべき出来事としてデザ     ...
関西Ruby会議02                検証失敗は正規ルート                •saveでfalseが返る                •美しいメッセージを用意                •表示用ヘルパー    ...
関西Ruby会議02                従って                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                    これは対象外                •                ユーザーによる不正な操作                で生じる不正な状態の検出             ...
関西Ruby会議02                 つまり                モデルの検証                  validate                                 株式会社万葉2009年...
関西Ruby会議02                 乱用されがち                (過度の期待)                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                乱用の例1                モデルの検証                   =                 Validate                        ...
関西Ruby会議02                  弊害1                  ユーザーが                 解決できない                エラーメッセージ                     ...
関西Ruby会議02                  弊害2                開発者が不具合に                 気づきにくい                            株式会社万葉2009年11月7日...
関西Ruby会議02                     弊害3                    無駄な労力                •無駄にきれいなメッセージ                •無駄に丁寧な例外処理       ...
関西Ruby会議02                   改善策                   モデルの検証                      validate                コールバックで例外          ...
関西Ruby会議02                    コールバック                •before_validation                •after_validation                •be...
関西Ruby会議02                           コード例                before_save :check_parent_id                private              ...
関西Ruby会議02                   専用の例外クラス                before_save :check_parent_id                private                de...
関西Ruby会議02                      そのほか                •initializeや代入時に不正状態                 をはじくことも                          ...
関西Ruby会議02                乱用の例2                            株式会社万葉2009年11月7日土曜日
関西Ruby会議02                 乱用の例2                 validate                モデルの        Controller層の                検証       ...
関西Ruby会議02                   検証を                エラー処理全般に                  利用する?                検証≠エラー処理                   ...
関西Ruby会議02                   まとめ                何を「検証」するか                •                モデルの状態                •         ...
関西Ruby会議02                2)場面によって                 検証ニーズが                  違うとき                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                     例                •コマンドラインツール                •管理者と一般人                •ウィザード形式での検証           ...
関西Ruby会議02                あるモデルの                「検証」は                1パターン                 ではない                         株式...
関西Ruby会議02                      でも                ActiveRecordの                 検証の通り道は                   1パターン           ...
関西Ruby会議02                そんなときは                         株式会社万葉2009年11月7日土曜日
関西Ruby会議02                       分岐させる                        Object                機能A     機能B      コンソール                ...
関西Ruby会議02                モデルの用語で表現                       Object                状態A    状態B      状態C                検証     ...
関西Ruby会議02                「状態」を設計する                         Object                デフォルト   loose?    by_admin?             ...
関西Ruby会議02                     各検証で分岐                validates_presence_of                :description,                  :...
関西Ruby会議02                意外と面倒くさい                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                 自明だと                思っていると                痛い目にあう                         株式会社万葉2009年11月7日土曜日
関西Ruby会議02                 モデルの様々な                 「使われ方」                を意識するとよい                          株式会社万葉2009年11月7...
関西Ruby会議02                    典型的な局面                •そのモデルの作成/編集画面                •関連モデルの作成/編集画面                •単体テスト    ...
関西Ruby会議02                2. 本当は奥が深い                 完                検証     の話                            株式会社万葉2009年11月7...
関西Ruby会議02                ちなみに                           株式会社万葉2009年11月7日土曜日
関西Ruby会議02                コールバック全般                 についても同じ                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                  Railsで選べる                コールバックの選択肢                •create/update/両方/なし                •検証の有無 ...
関西Ruby会議02                アプリケーションの                   要件は                  もっと複雑                           株式会社万葉2009年11月7...
関西Ruby会議02                    起こりがちな問題                •                削除していいかどうかのチェッ                ク条件が論理削除と物理削除で       ...
関西Ruby会議02                           ここでも                             Object                状態A         状態B        状態C    ...
関西Ruby会議02                 二段構え                要件を単純にする                うまく複雑化する                            株式会社万葉2009年11月7...
関西Ruby会議02                2.RESTfulとの                  付き合い方                             株式会社万葉2009年11月7日土曜日
関西Ruby会議02                日頃、RESTと                  おつきあい                 してますか?                           株式会社万葉2009年11月7...
関西Ruby会議02                    RESTとは?                •URLはリソース(名詞)                • groups/3/notes/1                •HTTPメ...
関西Ruby会議02                私のポジショニング                •REST厨ではない(多分)                •きれいなI/Fは気持ちいい                •現実主義者     ...
関西Ruby会議02                RailsでのRESTful                •   とっつきにくい                •   実用的                •   ちょっと足りない    ...
関西Ruby会議02                     大事なこと                •   逃げちゃだめだ                •   逃げちゃだめだ                •   (ry         ...
関西Ruby会議02                RESTfulにすると                なにが嬉しいか?                             株式会社万葉2009年11月7日土曜日
関西Ruby会議02                 Railsに                ついていく                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                きれいなI/Fは                 気持ちいい                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                予測できる                統一される                        株式会社万葉2009年11月7日土曜日
関西Ruby会議02                メンテナンス                 しやすい                        株式会社万葉2009年11月7日土曜日
関西Ruby会議02                 でも                難しい                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                うまくつき合う方法                1)   Rails的なツボ                2)   RESTの基本                3)   URLから考える...
関西Ruby会議02                1) Railsの                RESTfulの                  ツボ                                株式会社万葉2009年...
関西Ruby会議02                 前提知識                マッピング                            株式会社万葉2009年11月7日土曜日
関西Ruby会議02                  マッピング                (ルーティング)                      コントローラ                       コントローラ        ...
関西Ruby会議02                 Railsの                RESTfulの                  ツボは                               株式会社万葉2009年11...
関西Ruby会議02                よくあるアクションの                 よくある                 アクション                  アクション全体                  ...
関西Ruby会議02                マッピングを楽に                map.resources                      aaaao a      +option                m...
関西Ruby会議02                よくあるアクションの                          URL    メソッド     アクション                /groups           GET  ...
関西Ruby会議02                 マッピングを楽に                map.resources :groups                                     株式会社万葉2009年11...
関西Ruby会議02                    その他のことは                •なんとかしてください                • map.resourcesのオプション                • 名前付...
関西Ruby会議02                もう1点                           株式会社万葉2009年11月7日土曜日
関西Ruby会議02                 マッピング                (ルート)に                名前をつけよう                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                それをURLの                名前にしよう                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                 名前に対応する                メソッドがあれば                  便利じゃね?                          株式会社万葉2009年11月...
関西Ruby会議02                         例                groupsという名前をつけ                   たURLへリンクする                <%= link_to...
関西Ruby会議02                                 そこで                     URL           URL名       メソッド アクション                /gro...
関西Ruby会議02                       だから                map.resourcesすると                自動的にメソッドが使える                <%= link_t...
関西Ruby会議02                2) RESTの基本                            株式会社万葉2009年11月7日土曜日
関西Ruby会議02                リクエスト=                名詞 + 動詞                              株式会社万葉2009年11月7日土曜日
関西Ruby会議02                名詞         動詞                リソース   +   HTTP                 URL       メソッド                     ...
関西Ruby会議02                 名詞(リソース)                •相手は複数か、単数か?                • 名前は?                • 識別するための情報は?        ...
関西Ruby会議02                            名詞に注目                     URL           URL名       メソッド アクション                /groups...
関西Ruby会議02                               動詞                 種類       意味          特徴                 GET      取得     リソースの状...
関西Ruby会議02                            動詞に注目                     URL           URL名       メソッド アクション                /groups...
関西Ruby会議02                     つまり                •4つの動詞だけで機能を説明す                ることを考える                •                適...
関西Ruby会議02                3) URLから                   考える                           株式会社万葉2009年11月7日土曜日
関西Ruby会議02                 URLを設計して                   その後で                コントローラクラス                  を設計する                ...
関西Ruby会議02                    いつものやり方                •Wikiに URL、HTTPメソッ                 ド、アクション、機能の対応表                 を書く...
関西Ruby会議02                     すると                •きれいなURLになる                •うまくコントローラを分割でき                る             ...
関西Ruby会議02                4) routes.rbの                     整理                               株式会社万葉2009年11月7日土曜日
関西Ruby会議02                routes.rb は                散らかりやすい                              株式会社万葉2009年11月7日土曜日
関西Ruby会議02                楽になってない部分                map.resources                      aaaao a      +option                ...
関西Ruby会議02                    様々な要件                •                管理機能には /admin                •                /books/3...
関西Ruby会議02                難しいから間違える                •変なルート名                (delete_xxx_path ?)                •            ...
関西Ruby会議02                  おすすめの方策                •with_optionsの活用                • コントローラ別に記述する                • sub_res...
関西Ruby会議02                with_optionsの活用                map.with_options :path_prefix => books,                          :...
関西Ruby会議02                コントローラ別に記述                map.with_options                 :controller => books do |books|      ...
関西Ruby会議02                resourcesのネスト                map.resources :diaries do |d|                 d.resources :comments...
関西Ruby会議02                resourcesのネスト                •コントローラが分かれていてネ                スト構造ならとても便利                •        ...
関西Ruby会議02                ネストで散り散りの例                map.resources :diaries do |d|                 d.resources :comments   ...
関西Ruby会議02                どちらで階層化するか                  URL構造                    VS                 コントローラ                  ...
関西Ruby会議02                  私の意見                コントローラ構造                   優先                             株式会社万葉2009年11月7日...
関西Ruby会議02                    なぜなら                •                routes.rbをメンテナンスする                動機はアクション             ...
関西Ruby会議02                     なので                •                routes.rbでのネスト表記は、                コントローラ別の構造を損なわ       ...
関西Ruby会議02                    ネストを自前で                map.resources :diaries                map.with_options :controller =>...
関西Ruby会議02                sub_resources                   プラグイン                              株式会社万葉2009年11月7日土曜日
関西Ruby会議02                    コントローラ設計                •リソースごとに1コントローラ                • Railsではこれが作りやすい                    ...
関西Ruby会議02                  複数リソースを                 1コントローラに                •通常はしない                • new_comment          ...
関西Ruby会議02                 でも                本当は                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                必要な時もあります                •                複数のコントローラに共通のサ                ブリソースCRUDをつけたい          ...
関西Ruby会議02                汎用サブリソースの例                •   タグ                •   画像                •   通知設定                  ...
関西Ruby会議02                   モデルを                汎用化しているのに..                                本                             ...
関西Ruby会議02                    これはいやだ                •BooksTagsController                •AuthorsTagsController            ...
関西Ruby会議02                         こうしたい                             BooksController                TagService   AuthorsCo...
関西Ruby会議02                    Railsでのやり方                • routes.rbをゴリゴリ書く                map.book_tags /books/:id/tags,  ...
関西Ruby会議02                ほかに方法は                 ないの?                         株式会社万葉2009年11月7日土曜日
関西Ruby会議02                map.resourcesの                 オプションの限界                map.resources :books,                  :m...
関西Ruby会議02                 map.resourcesの                 オプションの限界(2)                map.resources :books, :member =>     ...
関西Ruby会議02                map.resourcesは                サブリソース同居の                 コントローラを                 助けてくれない         ...
関西Ruby会議02                    仕方なくゴリゴリ                •                たくさんのコントローラで同じ                ような定義                ...
関西Ruby会議02                大変                         株式会社万葉2009年11月7日土曜日
関西Ruby会議02                 そこで                プラグイン                作りました                           株式会社万葉2009年11月7日土曜日
関西Ruby会議02                sub_resources                     http://                github.com/nay/                 sub_res...
関西Ruby会議02                   こう書けます                map.resources :books,                 :sub_resources => :tags          ...
関西Ruby会議02                  オプションつき                map.resources :books,                 :sub_resources => {              ...
関西Ruby会議02                  複数リソースの                  update等も                スマートにマッピング                   URL        HTTPメ...
関西Ruby会議02                       サブリソースにも                     URL           HTTPメソッド   アクション                /books/tags/ed...
関西Ruby会議02                使ってみてね!                http://github.com/nay/                    sub_resources                  ...
関西Ruby会議02                まとめ                          株式会社万葉2009年11月7日土曜日
関西Ruby会議02                 メンテナンス                  しやすい                Railsコードを                 書くために                    ...
関西Ruby会議02                     今日の話                1.本当は奥が深い検証の話                2.RESTfulとの付き合い方                          ...
関西Ruby会議02                サイン会                 ジュンク堂                Ruby会議支店                           株式会社万葉2009年11月7日土曜日
関西Ruby会議02                  Railsによる                アジャイルWebア                プリケーション開発                    第三版             ...
関西Ruby会議02                  ご清聴                 ありがとう                ございました                y.ohba@everyleaf.com           ...
Upcoming SlideShare
Loading in …5
×

More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02

5,248 views

Published on

The presentation document of a speech at Kansai Ruby Kaigi #02.

Published in: Technology
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,248
On SlideShare
0
From Embeds
0
Number of Embeds
163
Actions
Shares
0
Downloads
24
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02

  1. 1. 関西Ruby会議02 続・現場で役立つ Ruby on Rails パターン (株)万葉 大場寧子 株式会社万葉2009年11月7日土曜日
  2. 2. 関西Ruby会議02 続 •Ruby会議2009 •Pragmatic Patterns of Ruby on Rails - 現場で役立 つRuby on Railsパターン 株式会社万葉2009年11月7日土曜日
  3. 3. 関西Ruby会議02 自己紹介 •プログラマ •Rails アプリケーションを開発 • Akasaka.rb •株式会社万葉 株式会社万葉2009年11月7日土曜日
  4. 4. 提供 株式会社 万葉 Everyleaf Corp.2009年11月7日土曜日
  5. 5. 関西Ruby会議02 Ruby on Rails 逆引きクイックリファレンス 株式会社万葉2009年11月7日土曜日
  6. 6. 関西Ruby会議02 サイン会 やります 株式会社万葉2009年11月7日土曜日
  7. 7. 関西Ruby会議02 作ってるもの •Web家計簿「小槌」 •iPhoneアプリ「iCarta」 • プラグイン類 • ナレジオン (株)ユーフィット 株式会社万葉2009年11月7日土曜日
  8. 8. 関西Ruby会議02 Web家計簿「小槌」 • http://www.kozuchi.net • http://github.com/everyleaf/kozuchi 株式会社万葉2009年11月7日土曜日
  9. 9. 関西Ruby会議02 iCarta 株式会社万葉2009年11月7日土曜日
  10. 10. 関西Ruby会議02 プラグイン http://github.com/nay •html5jp_graphs •sub_resources •record_with_operator •i18n_ext •image_upload (RubyForge) 株式会社万葉2009年11月7日土曜日
  11. 11. 関西Ruby会議02 ナレジオン http://knowledgeon.com/ (株)ユーフィット グループウェア 10/15 にリリース 株式会社万葉2009年11月7日土曜日
  12. 12. 関西Ruby会議02 ナレジオンの特徴 • ひととおりの機能の揃ったグ ループウェア • 気軽な情報公開ができる • しっかりした開示制限と横断的 な検索 • ワークフロー 株式会社万葉2009年11月7日土曜日
  13. 13. 関西Ruby会議02 Railsにしては 人数の多い 開発体制 (10人強) 株式会社万葉2009年11月7日土曜日
  14. 14. 関西Ruby会議02 Rubyでの開発 •少人数が「勝ち」と言われる 株式会社万葉2009年11月7日土曜日
  15. 15. 関西Ruby会議02 必要なら仕方ない • 短期間に多くの機能 • 並行開発 株式会社万葉2009年11月7日土曜日
  16. 16. 関西Ruby会議02 開発体制を工夫 •アジャイルっぽく • ペアプログラミング • 分担を固定しない •朝会 •合意作り 株式会社万葉2009年11月7日土曜日
  17. 17. 関西Ruby会議02 合意作りが大事 •大事なことは合意を作る •書いておく • 合意≠遵守 • 合意≠既成事実 株式会社万葉2009年11月7日土曜日
  18. 18. 関西Ruby会議02 そうした現場で 気づいた技術ネタを 今日喋ります 株式会社万葉2009年11月7日土曜日
  19. 19. 関西Ruby会議02 Ruby会議2009 で話したことの おさらい 株式会社万葉2009年11月7日土曜日
  20. 20. 関西Ruby会議02 アプリケーションが 大きく複雑に なると 株式会社万葉2009年11月7日土曜日
  21. 21. 関西Ruby会議02 メンテナンスが 大変になる 株式会社万葉2009年11月7日土曜日
  22. 22. 関西Ruby会議02 色々な人間が コードを触る 株式会社万葉2009年11月7日土曜日
  23. 23. 関西Ruby会議02 人によって 書き方が違ったり 株式会社万葉2009年11月7日土曜日
  24. 24. 関西Ruby会議02 変更しづらくなる 株式会社万葉2009年11月7日土曜日
  25. 25. 関西Ruby会議02 変更できることは大事 •小さくはじめられる •素早いサービスの開始 • 後から育てられる • ビジネスの変化についていく 株式会社万葉2009年11月7日土曜日
  26. 26. 関西Ruby会議02 さらに 株式会社万葉2009年11月7日土曜日
  27. 27. 関西Ruby会議02 Rails案件 Rails技術者の 増加 株式会社万葉2009年11月7日土曜日
  28. 28. 関西Ruby会議02 メンテナンスすべき Railsプロジェクト の増加 株式会社万葉2009年11月7日土曜日
  29. 29. 関西Ruby会議02 変更しやすさを 維持する 仕組みが必要! 株式会社万葉2009年11月7日土曜日
  30. 30. 関西Ruby会議02 それには? 株式会社万葉2009年11月7日土曜日
  31. 31. 関西Ruby会議02 コードを良い状態に 保つことが重要 株式会社万葉2009年11月7日土曜日
  32. 32. 関西Ruby会議02 良い状態 •いい設計 •読みやすい、わかりやすい •間違いにすぐ気づく 株式会社万葉2009年11月7日土曜日
  33. 33. 関西Ruby会議02 そこで実装パターン •Rails における実装パターンを 見つけ出し、共有する • 効率がよい • 一貫性がある 株式会社万葉2009年11月7日土曜日
  34. 34. 関西Ruby会議02 具体的には •ARオブジェクトから検索を始める •ARオブジェクトをフィルターで得る •ビジネスロジックをモデルに移動す る方法 • コールバックの活用 株式会社万葉2009年11月7日土曜日
  35. 35. 関西Ruby会議02 ということを Ruby会議2009で 話しました :) 株式会社万葉2009年11月7日土曜日
  36. 36. 関西Ruby会議02 本題 株式会社万葉2009年11月7日土曜日
  37. 37. 関西Ruby会議02 今日の話 1.本当は奥が深い検証の話 2.RESTfulとの付き合い方 株式会社万葉2009年11月7日土曜日
  38. 38. 関西Ruby会議02 その前に • Rubyをよく使っている 人? • Railsをよく使っている 人? 株式会社万葉2009年11月7日土曜日
  39. 39. 関西Ruby会議02 1. 本当は奥が深い 検証 の話 株式会社万葉2009年11月7日土曜日
  40. 40. 関西Ruby会議02 Rails の検証は 良くできている save 入力 検証 保存 画面 エラー情報 株式会社万葉2009年11月7日土曜日
  41. 41. 関西Ruby会議02 コード例:モデル class Book < ActiveRecord::Base validates_presence_of :title end 株式会社万葉2009年11月7日土曜日
  42. 42. 関西Ruby会議02 コード例:画面 <%= error_messages_for :book %> 株式会社万葉2009年11月7日土曜日
  43. 43. 関西Ruby会議02 任意の検証が書ける validate :check_title private def check_title errors.add(:title, Rubyがないよ!) unless title.to_s =~ /Ruby/2009年11月7日土曜日 end 株式会社万葉
  44. 44. 関西Ruby会議02 とても便利 •豊富な検証メソッド •自由に追加できる • エラーメッセージを扱える • 不正状態で保存するのを防止 株式会社万葉2009年11月7日土曜日
  45. 45. 関西Ruby会議02 しかし 株式会社万葉2009年11月7日土曜日
  46. 46. 関西Ruby会議02 最初の印象よりも 奥が深い 株式会社万葉2009年11月7日土曜日
  47. 47. 関西Ruby会議02 私の遭遇した課題 •乱用されることがある • 検証ニーズが場面によって違う 場合に困っている人を見かける 株式会社万葉2009年11月7日土曜日
  48. 48. 関西Ruby会議02 検証についての 課題 1)何を「検証」すればいいのか 2)場面によって検証ニーズが違う とき 株式会社万葉2009年11月7日土曜日
  49. 49. 関西Ruby会議02 1)何を 「検証」すれば いいのか 株式会社万葉2009年11月7日土曜日
  50. 50. 関西Ruby会議02 Rails の ActiveRecord の 「検証」とは? 株式会社万葉2009年11月7日土曜日
  51. 51. 関西Ruby会議02 一般的な定義 ActiveRecord オブジェクトが 不正な状態で 永続化されないように するための仕組み 株式会社万葉2009年11月7日土曜日
  52. 52. 関西Ruby会議02 いいえ 株式会社万葉2009年11月7日土曜日
  53. 53. 関西Ruby会議02 私の定義 ActiveRecord オブジェクトが ユーザーに許可された 操作によって 不正な状態で 永続化されないように するための仕組み 株式会社万葉2009年11月7日土曜日
  54. 54. 関西Ruby会議02 ユーザーに 許可された 操作によって 株式会社万葉2009年11月7日土曜日
  55. 55. 関西Ruby会議02 Railsの検証の失敗は、 予期された、 ユーザーに対して丁寧に対 応すべき出来事としてデザ インされている 株式会社万葉2009年11月7日土曜日
  56. 56. 関西Ruby会議02 検証失敗は正規ルート •saveでfalseが返る •美しいメッセージを用意 •表示用ヘルパー 株式会社万葉2009年11月7日土曜日
  57. 57. 関西Ruby会議02 従って 株式会社万葉2009年11月7日土曜日
  58. 58. 関西Ruby会議02 これは対象外 • ユーザーによる不正な操作 で生じる不正な状態の検出 • バグや故障によって生じる 不正な状態の検出 株式会社万葉2009年11月7日土曜日
  59. 59. 関西Ruby会議02 つまり モデルの検証 validate 株式会社万葉2009年11月7日土曜日
  60. 60. 関西Ruby会議02 乱用されがち (過度の期待) 株式会社万葉2009年11月7日土曜日
  61. 61. 関西Ruby会議02 乱用の例1 モデルの検証 = Validate 株式会社万葉2009年11月7日土曜日
  62. 62. 関西Ruby会議02 弊害1 ユーザーが 解決できない エラーメッセージ 株式会社万葉2009年11月7日土曜日
  63. 63. 関西Ruby会議02 弊害2 開発者が不具合に 気づきにくい 株式会社万葉2009年11月7日土曜日
  64. 64. 関西Ruby会議02 弊害3 無駄な労力 •無駄にきれいなメッセージ •無駄に丁寧な例外処理 株式会社万葉2009年11月7日土曜日
  65. 65. 関西Ruby会議02 改善策 モデルの検証 validate コールバックで例外 株式会社万葉2009年11月7日土曜日
  66. 66. 関西Ruby会議02 コールバック •before_validation •after_validation •before_save •after_save •etc... 株式会社万葉2009年11月7日土曜日
  67. 67. 関西Ruby会議02 コード例 before_save :check_parent_id private def check_parent_id return true unless parent raise “bad parent_id!” unless parent.user_id != user_id end 株式会社万葉2009年11月7日土曜日
  68. 68. 関西Ruby会議02 専用の例外クラス before_save :check_parent_id private def check_parent_id return true unless parent raise IllegalOperationError, “bad parent_id!” unless parent.user_id != user_id end 株式会社万葉2009年11月7日土曜日
  69. 69. 関西Ruby会議02 そのほか •initializeや代入時に不正状態 をはじくことも 株式会社万葉2009年11月7日土曜日
  70. 70. 関西Ruby会議02 乱用の例2 株式会社万葉2009年11月7日土曜日
  71. 71. 関西Ruby会議02 乱用の例2 validate モデルの Controller層の 検証 エラー処理 株式会社万葉2009年11月7日土曜日
  72. 72. 関西Ruby会議02 検証を エラー処理全般に 利用する? 検証≠エラー処理 株式会社万葉2009年11月7日土曜日
  73. 73. 関西Ruby会議02 まとめ 何を「検証」するか • モデルの状態 • ユーザーに許可した操作に よって起こりえる状態不正 株式会社万葉2009年11月7日土曜日
  74. 74. 関西Ruby会議02 2)場面によって 検証ニーズが 違うとき 株式会社万葉2009年11月7日土曜日
  75. 75. 関西Ruby会議02 例 •コマンドラインツール •管理者と一般人 •ウィザード形式での検証 •機能による違い •etc... 株式会社万葉2009年11月7日土曜日
  76. 76. 関西Ruby会議02 あるモデルの 「検証」は 1パターン ではない 株式会社万葉2009年11月7日土曜日
  77. 77. 関西Ruby会議02 でも ActiveRecordの 検証の通り道は 1パターン 株式会社万葉2009年11月7日土曜日
  78. 78. 関西Ruby会議02 そんなときは 株式会社万葉2009年11月7日土曜日
  79. 79. 関西Ruby会議02 分岐させる Object 機能A 機能B コンソール 検証 検証 検証 save save save 株式会社万葉2009年11月7日土曜日
  80. 80. 関西Ruby会議02 モデルの用語で表現 Object 状態A 状態B 状態C 検証 検証 検証 save save save 株式会社万葉2009年11月7日土曜日
  81. 81. 関西Ruby会議02 「状態」を設計する Object デフォルト loose? by_admin? 検証 検証 検証 save save save 株式会社万葉2009年11月7日土曜日
  82. 82. 関西Ruby会議02 各検証で分岐 validates_presence_of :description, :if => Proc.new {|o| !o.loose?} 株式会社万葉2009年11月7日土曜日
  83. 83. 関西Ruby会議02 意外と面倒くさい 株式会社万葉2009年11月7日土曜日
  84. 84. 関西Ruby会議02 自明だと 思っていると 痛い目にあう 株式会社万葉2009年11月7日土曜日
  85. 85. 関西Ruby会議02 モデルの様々な 「使われ方」 を意識するとよい 株式会社万葉2009年11月7日土曜日
  86. 86. 関西Ruby会議02 典型的な局面 •そのモデルの作成/編集画面 •関連モデルの作成/編集画面 •単体テスト •バッチ、ツール類 •コンソールでの訂正 株式会社万葉2009年11月7日土曜日
  87. 87. 関西Ruby会議02 2. 本当は奥が深い 完 検証 の話 株式会社万葉2009年11月7日土曜日
  88. 88. 関西Ruby会議02 ちなみに 株式会社万葉2009年11月7日土曜日
  89. 89. 関西Ruby会議02 コールバック全般 についても同じ 株式会社万葉2009年11月7日土曜日
  90. 90. 関西Ruby会議02 Railsで選べる コールバックの選択肢 •create/update/両方/なし •検証の有無 •destroyコールバックの有無 株式会社万葉2009年11月7日土曜日
  91. 91. 関西Ruby会議02 アプリケーションの 要件は もっと複雑 株式会社万葉2009年11月7日土曜日
  92. 92. 関西Ruby会議02 起こりがちな問題 • 削除していいかどうかのチェッ ク条件が論理削除と物理削除で 違う • 画面では子モデルを自動で作り たいがツールでは単体で作りた い 株式会社万葉2009年11月7日土曜日
  93. 93. 関西Ruby会議02 ここでも Object 状態A 状態B 状態C callback callback callback callback callback callback callback 株式会社万葉2009年11月7日土曜日
  94. 94. 関西Ruby会議02 二段構え 要件を単純にする うまく複雑化する 株式会社万葉2009年11月7日土曜日
  95. 95. 関西Ruby会議02 2.RESTfulとの 付き合い方 株式会社万葉2009年11月7日土曜日
  96. 96. 関西Ruby会議02 日頃、RESTと おつきあい してますか? 株式会社万葉2009年11月7日土曜日
  97. 97. 関西Ruby会議02 RESTとは? •URLはリソース(名詞) • groups/3/notes/1 •HTTPメソッドは操作(動詞) • GET → 取得したい • DELETE → 削除してください •シンプルで統一された、人間も 読むことのできるI/F 株式会社万葉2009年11月7日土曜日
  98. 98. 関西Ruby会議02 私のポジショニング •REST厨ではない(多分) •きれいなI/Fは気持ちいい •現実主義者 株式会社万葉2009年11月7日土曜日
  99. 99. 関西Ruby会議02 RailsでのRESTful • とっつきにくい • 実用的 • ちょっと足りない • routes.rbが鬼 株式会社万葉2009年11月7日土曜日
  100. 100. 関西Ruby会議02 大事なこと • 逃げちゃだめだ • 逃げちゃだめだ • (ry 株式会社万葉2009年11月7日土曜日
  101. 101. 関西Ruby会議02 RESTfulにすると なにが嬉しいか? 株式会社万葉2009年11月7日土曜日
  102. 102. 関西Ruby会議02 Railsに ついていく 株式会社万葉2009年11月7日土曜日
  103. 103. 関西Ruby会議02 きれいなI/Fは 気持ちいい 株式会社万葉2009年11月7日土曜日
  104. 104. 関西Ruby会議02 予測できる 統一される 株式会社万葉2009年11月7日土曜日
  105. 105. 関西Ruby会議02 メンテナンス しやすい 株式会社万葉2009年11月7日土曜日
  106. 106. 関西Ruby会議02 でも 難しい 株式会社万葉2009年11月7日土曜日
  107. 107. 関西Ruby会議02 うまくつき合う方法 1) Rails的なツボ 2) RESTの基本 3) URLから考える 4) routes.rbの整理 株式会社万葉2009年11月7日土曜日
  108. 108. 関西Ruby会議02 1) Railsの RESTfulの ツボ 株式会社万葉2009年11月7日土曜日
  109. 109. 関西Ruby会議02 前提知識 マッピング 株式会社万葉2009年11月7日土曜日
  110. 110. 関西Ruby会議02 マッピング (ルーティング) コントローラ コントローラ アクション アクション URL 株式会社万葉2009年11月7日土曜日
  111. 111. 関西Ruby会議02 Railsの RESTfulの ツボは 株式会社万葉2009年11月7日土曜日
  112. 112. 関西Ruby会議02 よくあるアクションの よくある アクション アクション全体 株式会社万葉2009年11月7日土曜日
  113. 113. 関西Ruby会議02 マッピングを楽に map.resources aaaao a +option map.resource map.xxx map.connect 株式会社万葉2009年11月7日土曜日
  114. 114. 関西Ruby会議02 よくあるアクションの URL メソッド アクション /groups GET index /groups POST create /groups/3 GET show /groups/3 PUT update /groups/3 DELETE destroy /groups/new GET new /groups/3/edit GET edit 株式会社万葉2009年11月7日土曜日
  115. 115. 関西Ruby会議02 マッピングを楽に map.resources :groups 株式会社万葉2009年11月7日土曜日
  116. 116. 関西Ruby会議02 その他のことは •なんとかしてください • map.resourcesのオプション • 名前付きルート • connet •最悪、何ともしなくても • /:controller/:action/:id 株式会社万葉2009年11月7日土曜日
  117. 117. 関西Ruby会議02 もう1点 株式会社万葉2009年11月7日土曜日
  118. 118. 関西Ruby会議02 マッピング (ルート)に 名前をつけよう 株式会社万葉2009年11月7日土曜日
  119. 119. 関西Ruby会議02 それをURLの 名前にしよう 株式会社万葉2009年11月7日土曜日
  120. 120. 関西Ruby会議02 名前に対応する メソッドがあれば 便利じゃね? 株式会社万葉2009年11月7日土曜日
  121. 121. 関西Ruby会議02 例 groupsという名前をつけ たURLへリンクする <%= link_to "グループ一覧", groups_path %> 株式会社万葉2009年11月7日土曜日
  122. 122. 関西Ruby会議02 そこで URL URL名 メソッド アクション /groups GET index groups /groups POST create /groups/3 GET show /groups/3 group PUT update /groups/3 DELETE destroy /groups/new new_group GET new /groups/3/edit edit_group GET edit 株式会社万葉2009年11月7日土曜日
  123. 123. 関西Ruby会議02 だから map.resourcesすると 自動的にメソッドが使える <%= link_to "グループ一覧", groups_path %> 株式会社万葉2009年11月7日土曜日
  124. 124. 関西Ruby会議02 2) RESTの基本 株式会社万葉2009年11月7日土曜日
  125. 125. 関西Ruby会議02 リクエスト= 名詞 + 動詞 株式会社万葉2009年11月7日土曜日
  126. 126. 関西Ruby会議02 名詞 動詞 リソース + HTTP URL メソッド 株式会社万葉2009年11月7日土曜日
  127. 127. 関西Ruby会議02 名詞(リソース) •相手は複数か、単数か? • 名前は? • 識別するための情報は? 株式会社万葉2009年11月7日土曜日
  128. 128. 関西Ruby会議02 名詞に注目 URL URL名 メソッド アクション /groups GET index groups /groups POST create /groups/3 GET show /groups/3 group PUT update /groups/3 DELETE destroy /groups/new new_group GET new /groups/3/edit edit_group GET edit 株式会社万葉2009年11月7日土曜日
  129. 129. 関西Ruby会議02 動詞 種類 意味 特徴 GET 取得 リソースの状態を変更しない PUT 更新/作成 URLの示すリソースが DELETE 削除 処理後も同じリソース POST なんか変更 上記以外 株式会社万葉2009年11月7日土曜日
  130. 130. 関西Ruby会議02 動詞に注目 URL URL名 メソッド アクション /groups GET index groups /groups POST create /groups/3 GET show /groups/3 group PUT update /groups/3 DELETE destroy /groups/new new_group GET new /groups/3/edit edit_group GET edit 株式会社万葉2009年11月7日土曜日
  131. 131. 関西Ruby会議02 つまり •4つの動詞だけで機能を説明す ることを考える • 適切な動詞 • 適切な名詞 株式会社万葉2009年11月7日土曜日
  132. 132. 関西Ruby会議02 3) URLから 考える 株式会社万葉2009年11月7日土曜日
  133. 133. 関西Ruby会議02 URLを設計して その後で コントローラクラス を設計する 株式会社万葉2009年11月7日土曜日
  134. 134. 関西Ruby会議02 いつものやり方 •Wikiに URL、HTTPメソッ ド、アクション、機能の対応表 を書く •レビューする 株式会社万葉2009年11月7日土曜日
  135. 135. 関西Ruby会議02 すると •きれいなURLになる •うまくコントローラを分割でき る • リソースという概念を意識 株式会社万葉2009年11月7日土曜日
  136. 136. 関西Ruby会議02 4) routes.rbの 整理 株式会社万葉2009年11月7日土曜日
  137. 137. 関西Ruby会議02 routes.rb は 散らかりやすい 株式会社万葉2009年11月7日土曜日
  138. 138. 関西Ruby会議02 楽になってない部分 map.resources aaaao a +option map.resource map.xxx map.connect 株式会社万葉2009年11月7日土曜日
  139. 139. 関西Ruby会議02 様々な要件 • 管理機能には /admin • /books/3/notes/2 のよう な深い構造 • dairy/2009/4 のような特殊 なURL 株式会社万葉2009年11月7日土曜日
  140. 140. 関西Ruby会議02 難しいから間違える •変なルート名 (delete_xxx_path ?) • 二重の定義 • 同じコントローラで同じ対象リ ソースが:idできたり :xxx_id できたりする 株式会社万葉2009年11月7日土曜日
  141. 141. 関西Ruby会議02 おすすめの方策 •with_optionsの活用 • コントローラ別に記述する • sub_resources 株式会社万葉2009年11月7日土曜日
  142. 142. 関西Ruby会議02 with_optionsの活用 map.with_options :path_prefix => books, :controller => books’ do |books| books.monthly_books :year/:month, :action => monthly books.daily_books :year/:month/:date :action => daily end 株式会社万葉2009年11月7日土曜日
  143. 143. 関西Ruby会議02 コントローラ別に記述 map.with_options :controller => books do |books| // BooksControllerのマッピング end map.with_options :controller => authors do |authors| // AuthorsControllerのマッピング end 株式会社万葉2009年11月7日土曜日
  144. 144. 関西Ruby会議02 resourcesのネスト map.resources :diaries do |d| d.resources :comments end diaries/3/comments/2 株式会社万葉2009年11月7日土曜日
  145. 145. 関西Ruby会議02 resourcesのネスト •コントローラが分かれていてネ スト構造ならとても便利 • 複雑になると「コントローラ 別」に記述できない 株式会社万葉2009年11月7日土曜日
  146. 146. 関西Ruby会議02 ネストで散り散りの例 map.resources :diaries do |d| d.resources :comments end map.all_comments diaries/comments’, :controller => diary_comments’, :action => all_comments 株式会社万葉2009年11月7日土曜日
  147. 147. 関西Ruby会議02 どちらで階層化するか URL構造 VS コントローラ 株式会社万葉2009年11月7日土曜日
  148. 148. 関西Ruby会議02 私の意見 コントローラ構造 優先 株式会社万葉2009年11月7日土曜日
  149. 149. 関西Ruby会議02 なぜなら • routes.rbをメンテナンスする 動機はアクション • 自然とコントローラを探す • コントローラ構造はみんなに把握 されている • URL構造は一部の人だけ 株式会社万葉2009年11月7日土曜日
  150. 150. 関西Ruby会議02 なので • routes.rbでのネスト表記は、 コントローラ別の構造を損なわ ないなら使う • 損なうならネストを使わず自前 で書く 株式会社万葉2009年11月7日土曜日
  151. 151. 関西Ruby会議02 ネストを自前で map.resources :diaries map.with_options :controller => diary_comments do |dc| dc.resources :comments, :path_prefix => diary/:diary_id, :name_prefix => diary_’ dc.all_comments diaries/comments’, :action => all_comments end 株式会社万葉2009年11月7日土曜日
  152. 152. 関西Ruby会議02 sub_resources プラグイン 株式会社万葉2009年11月7日土曜日
  153. 153. 関西Ruby会議02 コントローラ設計 •リソースごとに1コントローラ • Railsではこれが作りやすい (map.resources、フィルター) • 状況によってリソースに対して 複数コントローラ • 一般用とadmin用など 株式会社万葉2009年11月7日土曜日
  154. 154. 関西Ruby会議02 複数リソースを 1コントローラに •通常はしない • new_comment • delete_comment • ... • → XxxCommentsControllerへ 株式会社万葉2009年11月7日土曜日
  155. 155. 関西Ruby会議02 でも 本当は 株式会社万葉2009年11月7日土曜日
  156. 156. 関西Ruby会議02 必要な時もあります • 複数のコントローラに共通のサ ブリソースCRUDをつけたい • CRUD全部じゃなくて1つアク ションつけたいだけだから許し てほしい 株式会社万葉2009年11月7日土曜日
  157. 157. 関西Ruby会議02 汎用サブリソースの例 • タグ • 画像 • 通知設定 株式会社万葉2009年11月7日土曜日
  158. 158. 関西Ruby会議02 モデルを 汎用化しているのに.. 本 著者 Tag Tagging レビュー 株式会社万葉2009年11月7日土曜日
  159. 159. 関西Ruby会議02 これはいやだ •BooksTagsController •AuthorsTagsController • ReviewsTagsController • etc... 株式会社万葉2009年11月7日土曜日
  160. 160. 関西Ruby会議02 こうしたい BooksController TagService AuthorsController ReviewsController 株式会社万葉2009年11月7日土曜日
  161. 161. 関西Ruby会議02 Railsでのやり方 • routes.rbをゴリゴリ書く map.book_tags /books/:id/tags, :controller => books, :action => tags, :conditions => {:method => :get} 株式会社万葉2009年11月7日土曜日
  162. 162. 関西Ruby会議02 ほかに方法は ないの? 株式会社万葉2009年11月7日土曜日
  163. 163. 関西Ruby会議02 map.resourcesの オプションの限界 map.resources :books, :member => {:tags => :get} •ルート名が tags_book になる •動詞のアクションをそのままURLに 含める妥協案向き (lock など) 株式会社万葉2009年11月7日土曜日
  164. 164. 関西Ruby会議02 map.resourcesの オプションの限界(2) map.resources :books, :member => {:destroy_tag => :delete} • ルート名が destroy_tag_bookに • URLが /books/destroy_tag?tag_id = 3 に 株式会社万葉2009年11月7日土曜日
  165. 165. 関西Ruby会議02 map.resourcesは サブリソース同居の コントローラを 助けてくれない 株式会社万葉2009年11月7日土曜日
  166. 166. 関西Ruby会議02 仕方なくゴリゴリ • たくさんのコントローラで同じ ような定義 • DRYじゃない • さわりたくないroutes.rb • ゴミの山 株式会社万葉2009年11月7日土曜日
  167. 167. 関西Ruby会議02 大変 株式会社万葉2009年11月7日土曜日
  168. 168. 関西Ruby会議02 そこで プラグイン 作りました 株式会社万葉2009年11月7日土曜日
  169. 169. 関西Ruby会議02 sub_resources http:// github.com/nay/ sub_resources 株式会社万葉2009年11月7日土曜日
  170. 170. 関西Ruby会議02 こう書けます map.resources :books, :sub_resources => :tags 株式会社万葉2009年11月7日土曜日
  171. 171. 関西Ruby会議02 オプションつき map.resources :books, :sub_resources => { :tags => { :only => [:index, :delete] } } 株式会社万葉2009年11月7日土曜日
  172. 172. 関西Ruby会議02 複数リソースの update等も スマートにマッピング URL HTTPメソッド アクション /books/edit GET edit_all /books PUT update_all /books DELETE destroy_all 株式会社万葉2009年11月7日土曜日
  173. 173. 関西Ruby会議02 サブリソースにも URL HTTPメソッド アクション /books/tags/edit GET edit_tags /books/tags PUT update_tags /books/tags DELETE destroy_tags 株式会社万葉2009年11月7日土曜日
  174. 174. 関西Ruby会議02 使ってみてね! http://github.com/nay/ sub_resources 株式会社万葉2009年11月7日土曜日
  175. 175. 関西Ruby会議02 まとめ 株式会社万葉2009年11月7日土曜日
  176. 176. 関西Ruby会議02 メンテナンス しやすい Railsコードを 書くために 株式会社万葉2009年11月7日土曜日
  177. 177. 関西Ruby会議02 今日の話 1.本当は奥が深い検証の話 2.RESTfulとの付き合い方 株式会社万葉2009年11月7日土曜日
  178. 178. 関西Ruby会議02 サイン会 ジュンク堂 Ruby会議支店 株式会社万葉2009年11月7日土曜日
  179. 179. 関西Ruby会議02 Railsによる アジャイルWebア プリケーション開発 第三版 株式会社万葉2009年11月7日土曜日
  180. 180. 関西Ruby会議02 ご清聴 ありがとう ございました y.ohba@everyleaf.com nay3 株式会社万葉2009年11月7日土曜日

×