« 2006年09月 | メイン | 2006年11月 »

2006年10月16日 (月)

Rails勉強会@東京 第11回 [テクニカル]

前回に引き続き、毎月恒例のRails勉強会に参加。今回で第0回から数えるとちょうど1年経つことになるのかな。Railsの世界は流れが速い。

ポジションペーパーは、「Nested Resourcesとmap_singular_resourceプラグイン」ということで前のエントリそのまま。

前回ノートパソコンを購入するとか言っておきながらいまいち踏ん切りがつかずまだ購入できていない…。ということでまたノートなしでの参加。

前半セッションは「map.resourcesを知っておきたくはないか?+Beast」。map.resourcesといえば一応僕の得意分野ということでオーナーのもろはしさんを差し置いてのりおさんと2人でダラダラと進めちゃった感じ。参加された方はあんな感じでわかってもらえたでしょうか?わからなかったらすみません。

map.resourcesやRESTfulについてよくまとまっていた「PeepCode RESTful Rails Cheat Sheet」をポジションペーパーの裏側に印刷しておいたので、それに挙がっていることを一通り説明していった。

あとそれに沿ってRESTfulに作られた掲示板システムであるBeastについてもソースを読む予定だったが、そこまでたどり着かず。個人的にチラッと見た印象ではコード量も少ないしシンプルでわかりやすいなと思った。

後半セッションは「激論ABD」。最初はダラダラセッションかと思われていたがまったくそんなことはなく、まさしく激論が交わされた。たぶんあのメンバーの中であんまりついていけてなかったのは自分だけ。なんか頭が働いてなかった…。心より恥じる。ていうかこんなことではABD飲み会についていけないぞ。ってことで復習するので他の方(もろはしさんとかYuguiさんとか)のレポートを期待。

懇親会ではYuguiさんの記事の原稿を見せてもらった。おもしろい。Principle of least surpriseやConvention over Configurationなどのことについて、突っ込んだらここまで書けるのかと感心した。またもろはしさんには今自分の中でちょっとひっかかっているワークフロー・ワークステートとRailsの関係について聞いた。やっぱり理想的にはモデル(DB)から導出できるべきって感じか。今はまだ深追いできないかなという感じがした。

投稿者 4bit : 15:11 | コメント (0) | トラックバック (0)

2006年10月05日 (木)

map_singular_resourceプラグイン [テクニカル]

きのうのエントリに書いたが、Railsのmap.resourcesに対応するリソースは複数形で、複数あることが前提とされていた。それじゃ単数(1つしかない)リソースの場合どうするんだよ、ってことで、単数リソースに対応するmap_singular_resourceプラグインを作ってみた。

使い方

routes.rbに、map.resourcesと違って単数形で書く。

map.resource :person
# 紛らわしいので map.singular_resource :person も可

すると、だいたいこんな感じのルーティングが生成される。

HTTPメソッドとURLPersonControllerのアクションRoute Name
GET /person show person
POST /person create person
GET /person;edit edit edit_person
PUT /person update person
DELETE /person destroy person

map.resourcesからnewとindexを除いたような感じ。省略したけど、拡張子の:formatにももちろん対応している。:controller指定やアクション追加などのオプションももちろん使える。

has_one関係に使う

実はあんまり単体で使うことは少ないかもしれない。使われるとすればNested Resourcesで、モデル間の関係がhas_oneになっているときだ。

例えばUser has_one :profileというモデルの関係があったとすると、routes.rbにこのように書く。

map.resources :users do |user|
  user.resource :profile
end

すると、こんな感じのルーティングになる。

HTTPメソッドとURLProfileControllerのアクションRoute Name
GET /users/:user_id/profile show profile
POST /users/:user_id/profile create profile
GET /users/:user_id/profile;edit edit edit_profile
PUT /users/:user_id/profile update profile
DELETE /users/:user_id/profile destroy profile

きれいなURLでhas_oneの関係に対応しているのがわかる。

ソースは思いっきり手を抜いてactionpack/lib/action_controller/resources.rbからコピー&ペーストで作ったのでDRYじゃないし、相変わらずテストもないので不具合あるかも。でも使う機会はきっとあるような気がするなー。

投稿者 4bit : 17:43 | コメント (0) | トラックバック (0)

2006年10月04日 (水)

Nested Resources (map.resourcesのススメ その3) [テクニカル]

「map.resourcesのススメ」シリーズ第3回。

前回map.resourcesのオプションの利用方法を解説した中に、このようなものがあった。

特定のパラメータを必須にしたい場合

例えば、特定のグループ(ID)に属するユーザの一覧を表示したいとき、

map.resources :users

とするとURLは

/users?group_id=1

のようにgroup_idをパラメータに取ることになるが、あるグループに属するというのを標準にしたければ、

map.resources :users, :path_prefix => "/groups/:group_id"

とすると、URLは

/groups/1/users

とすっきりと表記できる。

これは、モデルがhas_manyの関係のときに非常に一般的なので、Nested Resourcesとして、このようにシンプルに書けるようになった。

map.resources :groups do |group|
  group.resources :users
end

これは、

map.resources :groups
map.resources :users, :path_prefix => "/groups/:group_id"

と書いたのと同じ効果を持つ。この場合はモデルはGroup has_many :usersって感じになる。

そこでふと思ったのだが、has_manyに対応するものがあるのに、has_oneに対応するものはないのか? そもそもRailsでのリソースって複数形のみで、単数(1つしかない)リソースが想定されてない気がする。has_oneもしくはカラム単体に対応するリソースがあれば、もっとモデルを柔軟に表現できるんじゃないか?

単数限定リソースを実現するmap_singular_resourceプラグインでも作ってみるか…。

投稿者 4bit : 17:10 | コメント (0) | トラックバック (0)