SlideShare a Scribd company logo
関西Ruby会議02




                続・現場で役立つ
                Ruby on Rails
                   パターン
                 (株)万葉 大場寧子

                                  株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                          続

                •Ruby会議2009
                •Pragmatic Patterns of
                 Ruby on Rails - 現場で役立
                 つRuby on Railsパターン

                                        株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                     自己紹介

                •プログラマ
                •Rails アプリケーションを開発
                • Akasaka.rb
                •株式会社万葉
                                   株式会社万葉
2009年11月7日土曜日
提供

                株式会社   万葉
                Everyleaf Corp.




2009年11月7日土曜日
関西Ruby会議02




                  Ruby on Rails
                逆引きクイックリファレンス




                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                サイン会
                やります
                       株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                   作ってるもの

                •Web家計簿「小槌」
                •iPhoneアプリ「iCarta」
                • プラグイン類
                • ナレジオン (株)ユーフィット

                                    株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                Web家計簿「小槌」
                • http://www.kozuchi.net
                • http://github.com/everyleaf/kozuchi



                                                  株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                iCarta




                             株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                      プラグイン
                    http://github.com/nay


                •html5jp_graphs
                •sub_resources
                •record_with_operator
                •i18n_ext
                •image_upload (RubyForge)
                                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                   ナレジオン


                http://knowledgeon.com/
                   (株)ユーフィット
                    グループウェア
                  10/15 にリリース
                                        株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    ナレジオンの特徴
                •
                ひととおりの機能の揃ったグ
                ループウェア
                •
                気軽な情報公開ができる
                •
                しっかりした開示制限と横断的
                な検索
                •
                ワークフロー
                               株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                Railsにしては
                 人数の多い
                  開発体制
                 (10人強)
                            株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    Rubyでの開発
                •少人数が「勝ち」と言われる




                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    必要なら仕方ない


                •   短期間に多くの機能
                •   並行開発

                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  開発体制を工夫

                •アジャイルっぽく
                • ペアプログラミング
                • 分担を固定しない
                •朝会
                •合意作り
                                  株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  合意作りが大事

                •大事なことは合意を作る
                •書いておく
                • 合意≠遵守
                • 合意≠既成事実

                                   株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 そうした現場で
                気づいた技術ネタを
                  今日喋ります

                           株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                Ruby会議2009
                 で話したことの
                     おさらい



                            株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                アプリケーションが
                  大きく複雑に
                    なると

                           株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                メンテナンスが
                 大変になる

                         株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                色々な人間が
                コードを触る


                         株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  人によって
                書き方が違ったり


                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                変更しづらくなる


                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                変更できることは大事

                •小さくはじめられる
                •素早いサービスの開始
                • 後から育てられる
                • ビジネスの変化についていく

                                  株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                さらに

                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 Rails案件
                Rails技術者の
                    増加

                            株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                メンテナンスすべき
                Railsプロジェクト
                     の増加

                             株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                変更しやすさを
                  維持する
                仕組みが必要!

                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                それには?

                        株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                コードを良い状態に
                 保つことが重要


                           株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    良い状態

                •いい設計
                •読みやすい、わかりやすい
                •間違いにすぐ気づく

                               株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                そこで実装パターン

                •Rails における実装パターンを
                見つけ出し、共有する
                •
                効率がよい
                •
                一貫性がある

                                   株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    具体的には

                •ARオブジェクトから検索を始める
                •ARオブジェクトをフィルターで得る
                •ビジネスロジックをモデルに移動す
                る方法
                •
                コールバックの活用

                                  株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 ということを


                Ruby会議2009で
                  話しました :)

                              株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                本題


                         株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                     今日の話


                1.本当は奥が深い検証の話
                2.RESTfulとの付き合い方



                                       株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    その前に

                •
                Rubyをよく使っている
                人?
                •
                Railsをよく使っている
                人?


                                    株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                1. 本当は奥が深い

                検証     の話

                            株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                Rails の検証は
                良くできている
                        save

                入力    検証     保存
                画面


                     エラー情報
                                   株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  コード例:モデル


                class Book < ActiveRecord::Base
                  validates_presence_of :title
                end



                                                  株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                   コード例:画面


                <%= error_messages_for :book %>



                                              株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                任意の検証が書ける
                validate :check_title

                private
                def check_title
                 errors.add(:title, 'Rubyがないよ!')
                unless title.to_s =~ /Ruby/
2009年11月7日土曜日
                end                               株式会社万葉
関西Ruby会議02




                    とても便利

                •豊富な検証メソッド
                •自由に追加できる
                • エラーメッセージを扱える
                • 不正状態で保存するのを防止

                                 株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                しかし


                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




             最初の印象よりも
               奥が深い

                        株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 私の遭遇した課題


                •乱用されることがある
                • 検証ニーズが場面によって違う
                場合に困っている人を見かける


                                 株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  検証についての
                    課題
                1)何を「検証」すればいいのか
                2)場面によって検証ニーズが違う
                 とき


                                 株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  1)何を
                「検証」すれば
                  いいのか
                         株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    Rails の
                ActiveRecord の

                「検証」とは?
                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  一般的な定義
                 ActiveRecord
                  オブジェクトが
                  不正な状態で
                永続化されないように
                 するための仕組み
                               株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                いいえ




                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                   私の定義
                 ActiveRecord
                  オブジェクトが
                ユーザーに許可された
                  操作によって
                  不正な状態で
                永続化されないように
                 するための仕組み       株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                ユーザーに
                許可された
                操作によって
                        株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                Railsの検証の失敗は、
                予期された、
                ユーザーに対して丁寧に対
                応すべき出来事としてデザ
                インされている

                               株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                検証失敗は正規ルート


                •saveでfalseが返る
                •美しいメッセージを用意
                •表示用ヘルパー

                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                従って


                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    これは対象外

                •
                ユーザーによる不正な操作
                で生じる不正な状態の検出
                •
                バグや故障によって生じる
                不正な状態の検出
                                 株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 つまり

                モデルの検証

                  validate

                                 株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 乱用されがち
                (過度の期待)


                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                乱用の例1

                モデルの検証
                   =
                 Validate

                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  弊害1

                  ユーザーが
                 解決できない
                エラーメッセージ
                            株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  弊害2


                開発者が不具合に
                 気づきにくい

                            株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                     弊害3

                    無駄な労力
                •無駄にきれいなメッセージ
                •無駄に丁寧な例外処理

                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                   改善策

                   モデルの検証

                      validate

                コールバックで例外
                                     株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    コールバック

                •before_validation
                •after_validation
                •before_save
                •after_save
                •etc...
                                         株式会社万葉
2009年11月7日土曜日
関西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日土曜日
関西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日土曜日
関西Ruby会議02




                      そのほか


                •initializeや代入時に不正状態
                 をはじくことも



                                     株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                乱用の例2


                            株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 乱用の例2
                 validate

                モデルの        Controller層の
                検証           エラー処理


                                       株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                   検証を
                エラー処理全般に
                  利用する?

                検証≠エラー処理
                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                   まとめ
                何を「検証」するか

                •
                モデルの状態
                •
                ユーザーに許可した操作に
                よって起こりえる状態不正

                             株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                2)場面によって
                 検証ニーズが
                  違うとき
                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                     例
                •コマンドラインツール
                •管理者と一般人
                •ウィザード形式での検証
                •機能による違い
                •etc...
                              株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                あるモデルの
                「検証」は
                1パターン
                 ではない
                         株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                      でも
                ActiveRecordの
                 検証の通り道は
                   1パターン
                              株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                そんなときは


                         株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                       分岐させる
                        Object


                機能A     機能B      コンソール

                検証      検証

                検証

                save    save      save

                                         株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                モデルの用語で表現
                       Object


                状態A    状態B      状態C

                検証     検証

                検証

                save   save     save

                                       株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                「状態」を設計する
                         Object


                デフォルト   loose?    by_admin?

                 検証      検証

                 検証

                 save    save        save

                                            株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                     各検証で分岐

                validates_presence_of
                :description,
                  :if => Proc.new {|o| !o.loose?}

                                               株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                意外と面倒くさい


                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 自明だと
                思っていると
                痛い目にあう

                         株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 モデルの様々な
                 「使われ方」
                を意識するとよい

                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    典型的な局面

                •そのモデルの作成/編集画面
                •関連モデルの作成/編集画面
                •単体テスト
                •バッチ、ツール類
                •コンソールでの訂正
                                 株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                2. 本当は奥が深い

                 完
                検証     の話

                            株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                ちなみに


                           株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                コールバック全般
                 についても同じ


                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  Railsで選べる
                コールバックの選択肢

                •create/update/両方/なし
                •検証の有無
                •destroyコールバックの有無

                                     株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                アプリケーションの
                   要件は
                  もっと複雑

                           株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    起こりがちな問題
                •
                削除していいかどうかのチェッ
                ク条件が論理削除と物理削除で
                違う
                •
                画面では子モデルを自動で作り
                たいがツールでは単体で作りた
                い
                               株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                           ここでも
                             Object


                状態A         状態B        状態C

                callback    callback

                callback               callback

                callback    callback   callback

                                                  株式会社万葉
2009年11月7日土曜日
関西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メソッドは操作(動詞)
                • GET → 取得したい
                • DELETE → 削除してください
                •シンプルで統一された、人間も
                読むことのできるI/F
                                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                私のポジショニング

                •REST厨ではない(多分)
                •きれいなI/Fは気持ちいい
                •現実主義者

                               株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                RailsでのRESTful

                •   とっつきにくい
                •   実用的
                •   ちょっと足りない
                •   routes.rbが鬼
                                      株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                     大事なこと

                •   逃げちゃだめだ
                •   逃げちゃだめだ
                •   (ry

                                  株式会社万葉
2009年11月7日土曜日
関西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から考える
                4)   routes.rbの整理
                                        株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                1) Railsの
                RESTfulの
                  ツボ
                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 前提知識



                マッピング
                            株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  マッピング
                (ルーティング)
                      コントローラ
                       コントローラ
                      アクション
                       アクション
                URL




                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 Railsの
                RESTfulの
                  ツボは

                               株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                よくあるアクションの

                 よくある
                 アクション

                  アクション全体

                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                マッピングを楽に

                map.resources
                      aaaao a      +option
                map.resource

                      map.xxx
                     map.connect
                                                 株式会社万葉
2009年11月7日土曜日
関西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日土曜日
関西Ruby会議02




                 マッピングを楽に


                map.resources :groups


                                     株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    その他のことは

                •なんとかしてください
                • map.resourcesのオプション
                • 名前付きルート
                • connet
                •最悪、何ともしなくても
                • /:controller/:action/:id
                                                 株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                もう1点


                           株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 マッピング
                (ルート)に
                名前をつけよう

                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                それをURLの
                名前にしよう


                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 名前に対応する
                メソッドがあれば
                  便利じゃね?

                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                         例
                'groups'という名前をつけ
                   たURLへリンクする

                <%= link_to "グループ一覧",
                   groups_path %>
                                        株式会社万葉
2009年11月7日土曜日
関西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日土曜日
関西Ruby会議02




                       だから
                map.resourcesすると
                自動的にメソッドが使える

                <%= link_to "グループ一覧",
                   groups_path %>
                                        株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                2) RESTの基本


                            株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                リクエスト=

                名詞 + 動詞

                              株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                名詞         動詞

                リソース   +   HTTP
                 URL       メソッド


                                 株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 名詞(リソース)


                •相手は複数か、単数か?
                • 名前は?
                • 識別するための情報は?


                                    株式会社万葉
2009年11月7日土曜日
関西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日土曜日
関西Ruby会議02




                               動詞
                 種類       意味          特徴

                 GET      取得     リソースの状態を変更しない

                 PUT     更新/作成    URLの示すリソースが
                DELETE    削除      処理後も同じリソース

                POST     なんか変更       上記以外



                                                株式会社万葉
2009年11月7日土曜日
関西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日土曜日
関西Ruby会議02




                     つまり

                •4つの動詞だけで機能を説明す
                ることを考える
                •
                適切な動詞
                •
                適切な名詞

                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                3) URLから
                   考える


                           株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 URLを設計して
                   その後で
                コントローラクラス
                  を設計する
                           株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    いつものやり方

                •Wikiに URL、HTTPメソッ
                 ド、アクション、機能の対応表
                 を書く
                •レビューする

                                    株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                     すると

                •きれいなURLになる
                •うまくコントローラを分割でき
                る
                •
                リソースという概念を意識

                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                4) routes.rbの
                     整理


                               株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                routes.rb は
                散らかりやすい


                              株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                楽になってない部分

                map.resources
                      aaaao a      +option
                map.resource

                      map.xxx
                     map.connect
                                                 株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    様々な要件

                •
                管理機能には /admin
                •
                /books/3/notes/2 のよう
                な深い構造
                •
                dairy/2009/4 のような特殊
                なURL
                                    株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                難しいから間違える
                •変なルート名
                (delete_xxx_path ?)
                •
                二重の定義
                •
                同じコントローラで同じ対象リ
                ソースが:idできたり :xxx_id
                できたりする
                                    株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  おすすめの方策


                •with_optionsの活用
                • コントローラ別に記述する
                • sub_resources


                                   株式会社万葉
2009年11月7日土曜日
関西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日土曜日
関西Ruby会議02




                コントローラ別に記述
                map.with_options
                 :controller => 'books' do |books|
                 // BooksControllerのマッピング
                end
                map.with_options
                 :controller => 'authors' do |authors|
                 // AuthorsControllerのマッピング
                end                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                resourcesのネスト
                map.resources :diaries do |d|
                 d.resources :comments
                end
                diaries/3/comments/2


                                              株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                resourcesのネスト

                •コントローラが分かれていてネ
                スト構造ならとても便利
                •
                複雑になると「コントローラ
                別」に記述できない

                                株式会社万葉
2009年11月7日土曜日
関西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日土曜日
関西Ruby会議02




                どちらで階層化するか

                  URL構造
                    VS
                 コントローラ
                              株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  私の意見


                コントローラ構造
                   優先

                             株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    なぜなら
                •
                routes.rbをメンテナンスする
                動機はアクション
                •
                自然とコントローラを探す
                •
                コントローラ構造はみんなに把握
                されている
                •
                URL構造は一部の人だけ
                                  株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                     なので

                •
                routes.rbでのネスト表記は、
                コントローラ別の構造を損なわ
                ないなら使う
                •
                損なうならネストを使わず自前
                で書く
                                  株式会社万葉
2009年11月7日土曜日
関西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日土曜日
関西Ruby会議02




                sub_resources
                   プラグイン


                              株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    コントローラ設計

                •リソースごとに1コントローラ
                • Railsではこれが作りやすい
                    (map.resources、フィルター)

                •
                状況によってリソースに対して
                複数コントローラ
                • 一般用とadmin用など
                                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  複数リソースを
                 1コントローラに
                •通常はしない
                • new_comment
                • delete_comment
                • ...
                • → XxxCommentsControllerへ
                                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 でも
                本当は


                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                必要な時もあります

                •
                複数のコントローラに共通のサ
                ブリソースCRUDをつけたい
                •
                CRUD全部じゃなくて1つアク
                ションつけたいだけだから許し
                てほしい
                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                汎用サブリソースの例

                •   タグ
                •   画像
                •   通知設定

                               株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                   モデルを
                汎用化しているのに..
                                本


                                       著者
                Tag   Tagging

                                レビュー

                                            株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    これはいやだ

                •BooksTagsController
                •AuthorsTagsController
                • ReviewsTagsController
                • etc...

                                        株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                         こうしたい

                             BooksController


                TagService   AuthorsController


                             ReviewsController


                                                   株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    Railsでのやり方

                • routes.rbをゴリゴリ書く

                map.book_tags '/books/:id/tags',
                 :controller => 'books',
                 :action => 'tags',
                 :conditions => {:method => :get}

                                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                ほかに方法は
                 ないの?


                         株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                map.resourcesの
                 オプションの限界
                map.resources :books,
                  :member => {:tags => :get}

                •ルート名が tags_book になる
                •動詞のアクションをそのままURLに
                 含める妥協案向き (lock など)
                                                   株式会社万葉
2009年11月7日土曜日
関西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日土曜日
関西Ruby会議02




                map.resourcesは
                サブリソース同居の
                 コントローラを
                 助けてくれない


                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                    仕方なくゴリゴリ

                •
                たくさんのコントローラで同じ
                ような定義
                •
                DRYじゃない
                •
                さわりたくないroutes.rb
                •
                ゴミの山
                                 株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                大変

                         株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 そこで


                プラグイン
                作りました
                           株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                sub_resources

                     http://
                github.com/nay/
                 sub_resources
                                株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                   こう書けます


                map.resources :books,
                 :sub_resources => :tags




                                               株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  オプションつき
                map.resources :books,
                 :sub_resources => {
                   :tags => {
                     :only => [:index, :delete]
                     }
                 }


                                                  株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  複数リソースの
                  update等も
                スマートにマッピング
                   URL        HTTPメソッド   アクション

                /books/edit     GET       edit_all

                  /books        PUT      update_all

                  /books       DELETE    destroy_all
                                                       株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                       サブリソースにも

                     URL           HTTPメソッド   アクション

                /books/tags/edit     GET       edit_tags

                  /books/tags        PUT      update_tags

                  /books/tags       DELETE    destroy_tags




                                                           株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                使ってみてね!
                http://github.com/nay/
                    sub_resources




                                         株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                まとめ


                          株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                 メンテナンス
                  しやすい
                Railsコードを
                 書くために
                            株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                     今日の話


                1.本当は奥が深い検証の話
                2.RESTfulとの付き合い方



                                       株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                サイン会
                 ジュンク堂
                Ruby会議支店
                           株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  Railsによる
                アジャイルWebア
                プリケーション開発
                    第三版
                            株式会社万葉
2009年11月7日土曜日
関西Ruby会議02




                  ご清聴
                 ありがとう
                ございました
                y.ohba@everyleaf.com
                       nay3
                                           株式会社万葉
2009年11月7日土曜日

More Related Content

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

All about Nihon Ruby-no-kai Season6(TochigiRubyKaigi02 Edit)
All about Nihon Ruby-no-kai Season6(TochigiRubyKaigi02 Edit)All about Nihon Ruby-no-kai Season6(TochigiRubyKaigi02 Edit)
All about Nihon Ruby-no-kai Season6(TochigiRubyKaigi02 Edit)Shintaro Kakutani
 
Ruby/PureImage: 第2回岡山Ruby会議LT
Ruby/PureImage: 第2回岡山Ruby会議LTRuby/PureImage: 第2回岡山Ruby会議LT
Ruby/PureImage: 第2回岡山Ruby会議LT
NISHIMOTO Keisuke
 
RubyによるMac OS Xデスクトップアプリケーション開発入門--Snow Leopard対応版
RubyによるMac OS Xデスクトップアプリケーション開発入門--Snow Leopard対応版RubyによるMac OS Xデスクトップアプリケーション開発入門--Snow Leopard対応版
RubyによるMac OS Xデスクトップアプリケーション開発入門--Snow Leopard対応版
宏治 高尾
 
Ruby札幌2008年の活動に向けて
Ruby札幌2008年の活動に向けてRuby札幌2008年の活動に向けて
Ruby札幌2008年の活動に向けてKoji SHIMADA
 
Sub Resources Rails Plug-in
Sub Resources Rails Plug-inSub Resources Rails Plug-in
Sub Resources Rails Plug-in
Yasuko Ohba
 
Kids, Ruby, Fun! ぼくたち、 Rubyプログラミング少年団! 〜小学生からはじめる Ruby プログラミング〜
Kids,Ruby,Fun! ぼくたち、 Rubyプログラミング少年団! 〜小学生からはじめる Ruby プログラミング〜Kids,Ruby,Fun! ぼくたち、 Rubyプログラミング少年団! 〜小学生からはじめる Ruby プログラミング〜
Kids, Ruby, Fun! ぼくたち、 Rubyプログラミング少年団! 〜小学生からはじめる Ruby プログラミング〜
宏治 高尾
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構について
Tomoya Kawanishi
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発
Koichi Shimozono
 
i18n_generatorsのご紹介
i18n_generatorsのご紹介i18n_generatorsのご紹介
i18n_generatorsのご紹介
Akira Matsuda
 
20100626-We-Think-We-Act
20100626-We-Think-We-Act20100626-We-Think-We-Act
20100626-We-Think-We-ActKoji SHIMADA
 
Ruby and I at 神奈川Ruby会議01
Ruby and I at 神奈川Ruby会議01Ruby and I at 神奈川Ruby会議01
Ruby and I at 神奈川Ruby会議01
Yutaka Tachibana
 
JRubyで作るapiサーバー
JRubyで作るapiサーバーJRubyで作るapiサーバー
JRubyで作るapiサーバー
Yamamoto Kazuhisa
 
Building Static Website With Github And Jekyll
Building Static Website With Github And JekyllBuilding Static Website With Github And Jekyll
Building Static Website With Github And JekyllYoji Shidara
 
Rails あるある
Rails あるあるRails あるある
Rails あるある
Ryunosuke SATO
 
Sinatraで鼻歌まじりのWeb開発
Sinatraで鼻歌まじりのWeb開発Sinatraで鼻歌まじりのWeb開発
Sinatraで鼻歌まじりのWeb開発
Yoji Shidara
 
2011-7-17 !RubyKaigi (NotRubyKaigi) 発表資料「WindowsマシンでRuby系勉強会へ行くと凹むことの考察」
2011-7-17 !RubyKaigi (NotRubyKaigi) 発表資料「WindowsマシンでRuby系勉強会へ行くと凹むことの考察」2011-7-17 !RubyKaigi (NotRubyKaigi) 発表資料「WindowsマシンでRuby系勉強会へ行くと凹むことの考察」
2011-7-17 !RubyKaigi (NotRubyKaigi) 発表資料「WindowsマシンでRuby系勉強会へ行くと凹むことの考察」Hiro H.
 
リアルビジネスRuby
リアルビジネスRubyリアルビジネスRuby
リアルビジネスRuby
Tomoya Kawanishi
 
Our Strategy To Survive In This Hard World(tochigirubykaigi02)
Our Strategy To Survive In This Hard World(tochigirubykaigi02)Our Strategy To Survive In This Hard World(tochigirubykaigi02)
Our Strategy To Survive In This Hard World(tochigirubykaigi02)Koji SHIMADA
 
Came From Ruby No Kai 20090124
Came From Ruby No Kai 20090124Came From Ruby No Kai 20090124
Came From Ruby No Kai 20090124Shintaro Kakutani
 
The Way We Are Working On Our Website @とちぎRuby会議02
The Way We Are Working On Our Website @とちぎRuby会議02The Way We Are Working On Our Website @とちぎRuby会議02
The Way We Are Working On Our Website @とちぎRuby会議02Yoji Shidara
 

Similar to More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02 (20)

All about Nihon Ruby-no-kai Season6(TochigiRubyKaigi02 Edit)
All about Nihon Ruby-no-kai Season6(TochigiRubyKaigi02 Edit)All about Nihon Ruby-no-kai Season6(TochigiRubyKaigi02 Edit)
All about Nihon Ruby-no-kai Season6(TochigiRubyKaigi02 Edit)
 
Ruby/PureImage: 第2回岡山Ruby会議LT
Ruby/PureImage: 第2回岡山Ruby会議LTRuby/PureImage: 第2回岡山Ruby会議LT
Ruby/PureImage: 第2回岡山Ruby会議LT
 
RubyによるMac OS Xデスクトップアプリケーション開発入門--Snow Leopard対応版
RubyによるMac OS Xデスクトップアプリケーション開発入門--Snow Leopard対応版RubyによるMac OS Xデスクトップアプリケーション開発入門--Snow Leopard対応版
RubyによるMac OS Xデスクトップアプリケーション開発入門--Snow Leopard対応版
 
Ruby札幌2008年の活動に向けて
Ruby札幌2008年の活動に向けてRuby札幌2008年の活動に向けて
Ruby札幌2008年の活動に向けて
 
Sub Resources Rails Plug-in
Sub Resources Rails Plug-inSub Resources Rails Plug-in
Sub Resources Rails Plug-in
 
Kids, Ruby, Fun! ぼくたち、 Rubyプログラミング少年団! 〜小学生からはじめる Ruby プログラミング〜
Kids,Ruby,Fun! ぼくたち、 Rubyプログラミング少年団! 〜小学生からはじめる Ruby プログラミング〜Kids,Ruby,Fun! ぼくたち、 Rubyプログラミング少年団! 〜小学生からはじめる Ruby プログラミング〜
Kids, Ruby, Fun! ぼくたち、 Rubyプログラミング少年団! 〜小学生からはじめる Ruby プログラミング〜
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構について
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発
 
i18n_generatorsのご紹介
i18n_generatorsのご紹介i18n_generatorsのご紹介
i18n_generatorsのご紹介
 
20100626-We-Think-We-Act
20100626-We-Think-We-Act20100626-We-Think-We-Act
20100626-We-Think-We-Act
 
Ruby and I at 神奈川Ruby会議01
Ruby and I at 神奈川Ruby会議01Ruby and I at 神奈川Ruby会議01
Ruby and I at 神奈川Ruby会議01
 
JRubyで作るapiサーバー
JRubyで作るapiサーバーJRubyで作るapiサーバー
JRubyで作るapiサーバー
 
Building Static Website With Github And Jekyll
Building Static Website With Github And JekyllBuilding Static Website With Github And Jekyll
Building Static Website With Github And Jekyll
 
Rails あるある
Rails あるあるRails あるある
Rails あるある
 
Sinatraで鼻歌まじりのWeb開発
Sinatraで鼻歌まじりのWeb開発Sinatraで鼻歌まじりのWeb開発
Sinatraで鼻歌まじりのWeb開発
 
2011-7-17 !RubyKaigi (NotRubyKaigi) 発表資料「WindowsマシンでRuby系勉強会へ行くと凹むことの考察」
2011-7-17 !RubyKaigi (NotRubyKaigi) 発表資料「WindowsマシンでRuby系勉強会へ行くと凹むことの考察」2011-7-17 !RubyKaigi (NotRubyKaigi) 発表資料「WindowsマシンでRuby系勉強会へ行くと凹むことの考察」
2011-7-17 !RubyKaigi (NotRubyKaigi) 発表資料「WindowsマシンでRuby系勉強会へ行くと凹むことの考察」
 
リアルビジネスRuby
リアルビジネスRubyリアルビジネスRuby
リアルビジネスRuby
 
Our Strategy To Survive In This Hard World(tochigirubykaigi02)
Our Strategy To Survive In This Hard World(tochigirubykaigi02)Our Strategy To Survive In This Hard World(tochigirubykaigi02)
Our Strategy To Survive In This Hard World(tochigirubykaigi02)
 
Came From Ruby No Kai 20090124
Came From Ruby No Kai 20090124Came From Ruby No Kai 20090124
Came From Ruby No Kai 20090124
 
The Way We Are Working On Our Website @とちぎRuby会議02
The Way We Are Working On Our Website @とちぎRuby会議02The Way We Are Working On Our Website @とちぎRuby会議02
The Way We Are Working On Our Website @とちぎRuby会議02
 

More from Yasuko Ohba

Rubyによる開発プロジェクトをうまく回すには(2)
Rubyによる開発プロジェクトをうまく回すには(2)Rubyによる開発プロジェクトをうまく回すには(2)
Rubyによる開発プロジェクトをうまく回すには(2)
Yasuko Ohba
 
TECH LAB PAAK 2015/06/24 Team Development
TECH LAB PAAK 2015/06/24 Team DevelopmentTECH LAB PAAK 2015/06/24 Team Development
TECH LAB PAAK 2015/06/24 Team Development
Yasuko Ohba
 
女性IT技術者と働き方 情報処理学会77
女性IT技術者と働き方 情報処理学会77女性IT技術者と働き方 情報処理学会77
女性IT技術者と働き方 情報処理学会77
Yasuko Ohba
 
Girl, Geek and Company - Tokyo Girl Geek Dinners #5 2013/7/5
Girl, Geek and Company - Tokyo Girl Geek Dinners #5 2013/7/5Girl, Geek and Company - Tokyo Girl Geek Dinners #5 2013/7/5
Girl, Geek and Company - Tokyo Girl Geek Dinners #5 2013/7/5
Yasuko Ohba
 
世界を描く Drawing the world
世界を描く Drawing the world世界を描く Drawing the world
世界を描く Drawing the world
Yasuko Ohba
 
名前のつけ方
名前のつけ方名前のつけ方
名前のつけ方
Yasuko Ohba
 
Shimane2010
Shimane2010Shimane2010
Shimane2010
Yasuko Ohba
 
Smell in Rails Apps (in Sapporo RubyKaigi03)
Smell in Rails Apps (in Sapporo RubyKaigi03)Smell in Rails Apps (in Sapporo RubyKaigi03)
Smell in Rails Apps (in Sapporo RubyKaigi03)
Yasuko Ohba
 
The Basis of Making DSL with Ruby
The Basis of Making DSL with RubyThe Basis of Making DSL with Ruby
The Basis of Making DSL with Ruby
Yasuko Ohba
 
Pragmatic Patterns of Ruby on Rails - Ruby Kaigi2009
Pragmatic Patterns of Ruby on Rails - Ruby Kaigi2009Pragmatic Patterns of Ruby on Rails - Ruby Kaigi2009
Pragmatic Patterns of Ruby on Rails - Ruby Kaigi2009
Yasuko Ohba
 
Raspbilly
RaspbillyRaspbilly
Raspbilly
Yasuko Ohba
 
テスト大嫌いっ娘のRSpec
テスト大嫌いっ娘のRSpecテスト大嫌いっ娘のRSpec
テスト大嫌いっ娘のRSpec
Yasuko Ohba
 
Shimane2008
Shimane2008Shimane2008
Shimane2008
Yasuko Ohba
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
Yasuko Ohba
 
image_upload Plugin 2007/12/7
image_upload Plugin 2007/12/7image_upload Plugin 2007/12/7
image_upload Plugin 2007/12/7
Yasuko Ohba
 
Ruby on Rails ステップアップ講座 - 大場寧子
Ruby on Rails ステップアップ講座 - 大場寧子Ruby on Rails ステップアップ講座 - 大場寧子
Ruby on Rails ステップアップ講座 - 大場寧子
Yasuko Ohba
 
Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子
Yasuko Ohba
 
Bookscope 2007 09 07
Bookscope 2007 09 07Bookscope 2007 09 07
Bookscope 2007 09 07
Yasuko Ohba
 

More from Yasuko Ohba (18)

Rubyによる開発プロジェクトをうまく回すには(2)
Rubyによる開発プロジェクトをうまく回すには(2)Rubyによる開発プロジェクトをうまく回すには(2)
Rubyによる開発プロジェクトをうまく回すには(2)
 
TECH LAB PAAK 2015/06/24 Team Development
TECH LAB PAAK 2015/06/24 Team DevelopmentTECH LAB PAAK 2015/06/24 Team Development
TECH LAB PAAK 2015/06/24 Team Development
 
女性IT技術者と働き方 情報処理学会77
女性IT技術者と働き方 情報処理学会77女性IT技術者と働き方 情報処理学会77
女性IT技術者と働き方 情報処理学会77
 
Girl, Geek and Company - Tokyo Girl Geek Dinners #5 2013/7/5
Girl, Geek and Company - Tokyo Girl Geek Dinners #5 2013/7/5Girl, Geek and Company - Tokyo Girl Geek Dinners #5 2013/7/5
Girl, Geek and Company - Tokyo Girl Geek Dinners #5 2013/7/5
 
世界を描く Drawing the world
世界を描く Drawing the world世界を描く Drawing the world
世界を描く Drawing the world
 
名前のつけ方
名前のつけ方名前のつけ方
名前のつけ方
 
Shimane2010
Shimane2010Shimane2010
Shimane2010
 
Smell in Rails Apps (in Sapporo RubyKaigi03)
Smell in Rails Apps (in Sapporo RubyKaigi03)Smell in Rails Apps (in Sapporo RubyKaigi03)
Smell in Rails Apps (in Sapporo RubyKaigi03)
 
The Basis of Making DSL with Ruby
The Basis of Making DSL with RubyThe Basis of Making DSL with Ruby
The Basis of Making DSL with Ruby
 
Pragmatic Patterns of Ruby on Rails - Ruby Kaigi2009
Pragmatic Patterns of Ruby on Rails - Ruby Kaigi2009Pragmatic Patterns of Ruby on Rails - Ruby Kaigi2009
Pragmatic Patterns of Ruby on Rails - Ruby Kaigi2009
 
Raspbilly
RaspbillyRaspbilly
Raspbilly
 
テスト大嫌いっ娘のRSpec
テスト大嫌いっ娘のRSpecテスト大嫌いっ娘のRSpec
テスト大嫌いっ娘のRSpec
 
Shimane2008
Shimane2008Shimane2008
Shimane2008
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 
image_upload Plugin 2007/12/7
image_upload Plugin 2007/12/7image_upload Plugin 2007/12/7
image_upload Plugin 2007/12/7
 
Ruby on Rails ステップアップ講座 - 大場寧子
Ruby on Rails ステップアップ講座 - 大場寧子Ruby on Rails ステップアップ講座 - 大場寧子
Ruby on Rails ステップアップ講座 - 大場寧子
 
Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子
 
Bookscope 2007 09 07
Bookscope 2007 09 07Bookscope 2007 09 07
Bookscope 2007 09 07
 

Recently uploaded

iMacwoSu_Gong_de_barabaranishitaHua_.pptx
iMacwoSu_Gong_de_barabaranishitaHua_.pptxiMacwoSu_Gong_de_barabaranishitaHua_.pptx
iMacwoSu_Gong_de_barabaranishitaHua_.pptx
kitamisetagayaxxx
 
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
Yuki Miyazaki
 
気ままなLLMをAgents for Amazon Bedrockでちょっとだけ飼いならす
気ままなLLMをAgents for Amazon Bedrockでちょっとだけ飼いならす気ままなLLMをAgents for Amazon Bedrockでちょっとだけ飼いならす
気ままなLLMをAgents for Amazon Bedrockでちょっとだけ飼いならす
Shinichi Hirauchi
 
ろくに電子工作もしたことない人間がIoT用ミドルウェアを作った話(IoTLT vol112 発表資料)
ろくに電子工作もしたことない人間がIoT用ミドルウェアを作った話(IoTLT  vol112 発表資料)ろくに電子工作もしたことない人間がIoT用ミドルウェアを作った話(IoTLT  vol112 発表資料)
ろくに電子工作もしたことない人間がIoT用ミドルウェアを作った話(IoTLT vol112 発表資料)
Takuya Minagawa
 
20240621_AI事業者ガイドライン_セキュリティパートの紹介_SeiyaShimabukuro
20240621_AI事業者ガイドライン_セキュリティパートの紹介_SeiyaShimabukuro20240621_AI事業者ガイドライン_セキュリティパートの紹介_SeiyaShimabukuro
20240621_AI事業者ガイドライン_セキュリティパートの紹介_SeiyaShimabukuro
Seiya Shimabukuro
 
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
嶋 是一 (Yoshikazu SHIMA)
 
協働AIがもたらす業務効率革命 -日本企業が押さえるべきポイント-Collaborative AI Revolutionizing Busines...
協働AIがもたらす業務効率革命 -日本企業が押さえるべきポイント-Collaborative AI Revolutionizing Busines...協働AIがもたらす業務効率革命 -日本企業が押さえるべきポイント-Collaborative AI Revolutionizing Busines...
協働AIがもたらす業務効率革命 -日本企業が押さえるべきポイント-Collaborative AI Revolutionizing Busines...
Osaka University
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
Osaka University
 
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
sugiuralab
 
なぜそのDDDは効果が薄いのか?名ばかりDX案件での経験を踏まえて培った他の思考を交えた現代風?のDDD
なぜそのDDDは効果が薄いのか?名ばかりDX案件での経験を踏まえて培った他の思考を交えた現代風?のDDDなぜそのDDDは効果が薄いのか?名ばかりDX案件での経験を踏まえて培った他の思考を交えた現代風?のDDD
なぜそのDDDは効果が薄いのか?名ばかりDX案件での経験を踏まえて培った他の思考を交えた現代風?のDDD
ssuserfcafd1
 
生成AIの実利用に必要なこと-Practical Requirements for the Deployment of Generative AI
生成AIの実利用に必要なこと-Practical Requirements for the Deployment of Generative AI生成AIの実利用に必要なこと-Practical Requirements for the Deployment of Generative AI
生成AIの実利用に必要なこと-Practical Requirements for the Deployment of Generative AI
Osaka University
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
azuma satoshi
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
tazaki1
 
【JSAI2024】LLMエージェントの人間との対話における反芻的返答の親近感向上効果_v1.1.pdf
【JSAI2024】LLMエージェントの人間との対話における反芻的返答の親近感向上効果_v1.1.pdf【JSAI2024】LLMエージェントの人間との対話における反芻的返答の親近感向上効果_v1.1.pdf
【JSAI2024】LLMエージェントの人間との対話における反芻的返答の親近感向上効果_v1.1.pdf
ARISE analytics
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
osamut
 

Recently uploaded (15)

iMacwoSu_Gong_de_barabaranishitaHua_.pptx
iMacwoSu_Gong_de_barabaranishitaHua_.pptxiMacwoSu_Gong_de_barabaranishitaHua_.pptx
iMacwoSu_Gong_de_barabaranishitaHua_.pptx
 
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
 
気ままなLLMをAgents for Amazon Bedrockでちょっとだけ飼いならす
気ままなLLMをAgents for Amazon Bedrockでちょっとだけ飼いならす気ままなLLMをAgents for Amazon Bedrockでちょっとだけ飼いならす
気ままなLLMをAgents for Amazon Bedrockでちょっとだけ飼いならす
 
ろくに電子工作もしたことない人間がIoT用ミドルウェアを作った話(IoTLT vol112 発表資料)
ろくに電子工作もしたことない人間がIoT用ミドルウェアを作った話(IoTLT  vol112 発表資料)ろくに電子工作もしたことない人間がIoT用ミドルウェアを作った話(IoTLT  vol112 発表資料)
ろくに電子工作もしたことない人間がIoT用ミドルウェアを作った話(IoTLT vol112 発表資料)
 
20240621_AI事業者ガイドライン_セキュリティパートの紹介_SeiyaShimabukuro
20240621_AI事業者ガイドライン_セキュリティパートの紹介_SeiyaShimabukuro20240621_AI事業者ガイドライン_セキュリティパートの紹介_SeiyaShimabukuro
20240621_AI事業者ガイドライン_セキュリティパートの紹介_SeiyaShimabukuro
 
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
 
協働AIがもたらす業務効率革命 -日本企業が押さえるべきポイント-Collaborative AI Revolutionizing Busines...
協働AIがもたらす業務効率革命 -日本企業が押さえるべきポイント-Collaborative AI Revolutionizing Busines...協働AIがもたらす業務効率革命 -日本企業が押さえるべきポイント-Collaborative AI Revolutionizing Busines...
協働AIがもたらす業務効率革命 -日本企業が押さえるべきポイント-Collaborative AI Revolutionizing Busines...
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
 
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
 
なぜそのDDDは効果が薄いのか?名ばかりDX案件での経験を踏まえて培った他の思考を交えた現代風?のDDD
なぜそのDDDは効果が薄いのか?名ばかりDX案件での経験を踏まえて培った他の思考を交えた現代風?のDDDなぜそのDDDは効果が薄いのか?名ばかりDX案件での経験を踏まえて培った他の思考を交えた現代風?のDDD
なぜそのDDDは効果が薄いのか?名ばかりDX案件での経験を踏まえて培った他の思考を交えた現代風?のDDD
 
生成AIの実利用に必要なこと-Practical Requirements for the Deployment of Generative AI
生成AIの実利用に必要なこと-Practical Requirements for the Deployment of Generative AI生成AIの実利用に必要なこと-Practical Requirements for the Deployment of Generative AI
生成AIの実利用に必要なこと-Practical Requirements for the Deployment of Generative AI
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
 
【JSAI2024】LLMエージェントの人間との対話における反芻的返答の親近感向上効果_v1.1.pdf
【JSAI2024】LLMエージェントの人間との対話における反芻的返答の親近感向上効果_v1.1.pdf【JSAI2024】LLMエージェントの人間との対話における反芻的返答の親近感向上効果_v1.1.pdf
【JSAI2024】LLMエージェントの人間との対話における反芻的返答の親近感向上効果_v1.1.pdf
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
 

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

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