More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02
-
Upload
nay -
Category
Technology
-
view
2.206 -
download
3
description
Transcript of More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02
関西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
プラグイン
•html5jp_graphs•sub_resources•record_with_operator•i18n_ext•image_upload (RubyForge)
http://github.com/nay
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 :titleend
2009年11月7日土曜日
株式会社万葉
関西Ruby会議02
コード例:画面
<%= error_messages_for :book %>
2009年11月7日土曜日
株式会社万葉
関西Ruby会議02
任意の検証が書けるvalidate :check_title
privatedef check_title errors.add(:title, 'Rubyがないよ!')
unless title.to_s =~ /Ruby/end
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
検証についての課題
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
privatedef check_parent_id return true unless parent raise “bad parent_id!” unless parent.user_id != user_idend
コード例
2009年11月7日土曜日
株式会社万葉
関西Ruby会議02
before_save :check_parent_id
privatedef check_parent_id return true unless parent raise IllegalOperationError, “bad parent_id!” unless parent.user_id != user_idend
専用の例外クラス
2009年11月7日土曜日
株式会社万葉
関西Ruby会議02
そのほか
•initializeや代入時に不正状態をはじくことも
2009年11月7日土曜日
株式会社万葉
関西Ruby会議02
乱用の例2
2009年11月7日土曜日
株式会社万葉
関西Ruby会議02
validate
乱用の例2
モデルの検証
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
検証
save save save
機能A 機能B コンソール
2009年11月7日土曜日
株式会社万葉
関西Ruby会議02
モデルの用語で表現
検証
検証
Object
検証
save save save
状態A 状態B 状態C
2009年11月7日土曜日
株式会社万葉
関西Ruby会議02
「状態」を設計する
検証
検証
Object
検証
save save save
デフォルト loose? by_admin?
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
ここでも
callback
callback
Object
callback
callback callback callback
状態A 状態B 状態C
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.xxxmap.connect
aaaao a
マッピングを楽に
map.resourcesmap.resource
+option
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名 メソッド アクション
/groupsgroups
GET index
/groupsgroups
POST create
/groups/3
group
GET show
/groups/3 group PUT update
/groups/3
group
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
+名詞
リソースURL
動詞
HTTPメソッド
2009年11月7日土曜日
株式会社万葉
関西Ruby会議02
名詞(リソース)
•相手は複数か、単数か?•名前は?•識別するための情報は?
2009年11月7日土曜日
株式会社万葉
関西Ruby会議02
名詞に注目URL URL名 メソッド アクション
/groupsgroups
GET index
/groupsgroups
POST create
/groups/3
group
GET show
/groups/3 group PUT update
/groups/3
group
DELETE destroy
/groups/new new_group GET new
/groups/3/edit edit_group GET edit
2009年11月7日土曜日
株式会社万葉
関西Ruby会議02
動詞種類 意味 特徴
GET 取得 リソースの状態を変更しない
PUT 更新/作成 URLの示すリソースが処理後も同じリソースDELETE 削除URLの示すリソースが処理後も同じリソース
POST なんか変更 上記以外
2009年11月7日土曜日
株式会社万葉
関西Ruby会議02
動詞に注目URL URL名 メソッド アクション
/groupsgroups
GET index
/groupsgroups
POST create
/groups/3
group
GET show
/groups/3 group PUT update
/groups/3
group
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.xxxmap.connect
aaaao a
楽になってない部分
map.resourcesmap.resource
+option
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
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
with_optionsの活用
2009年11月7日土曜日
株式会社万葉
関西Ruby会議02
コントローラ別に記述map.with_options :controller => 'books' do |books| // BooksControllerのマッピングendmap.with_options :controller => 'authors' do |authors| // AuthorsControllerのマッピングend
2009年11月7日土曜日
株式会社万葉
関西Ruby会議02
resourcesのネストmap.resources :diaries do |d| d.resources :commentsend
diaries/3/comments/2
2009年11月7日土曜日
株式会社万葉
関西Ruby会議02
resourcesのネスト
•コントローラが分かれていてネスト構造ならとても便利•複雑になると「コントローラ別」に記述できない
2009年11月7日土曜日
株式会社万葉
関西Ruby会議02
ネストで散り散りの例map.resources :diaries do |d| d.resources :commentsendmap.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 :diariesmap.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
AuthorsController
ReviewsController
TagService
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
http://github.com/nay/sub_resources
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日土曜日