RAILS PRESS RUBY on RAILS, it’s DRY and COOL …

RSS Feed

RAILS PRESS RSS

Tag Cloud

はてなブックマーク - railspress.matake.jp の注目エントリー
象形文字くさび形文字ミイラそろばんの玉そろばんコーラン占いの板?象牙大英博物館
« 前のエントリ
Rails2.0でのform(form_forとrender :partial => ‘form’を同時に使う方法)
次のエントリー »
Hpricotのバージョンを0.5=>0.6にあげる時の注意点(inner_textでNoMethodError)

Posted on
2007/12/29

Tags
ActionController, Rails2.0, Routes, まとめ

Keywords


この記事をはてなブックマークに登録 この記事のはてなブックマーク数 この記事を livedoor クリップに登録この記事の livedoor クリップ数 このエントリを del.icio.us に追加
ブックマークに追加する

Rails2.0のRouting(config/routes.rb)の記述方式についてのまとめ。

なんだかRails2.0になってから、routes.rbの書き方を毎回Googleさんに聞いている気がしたので、ちょっとまとめておきます。
(この他にも、routesの記述方式についての有用な情報があれば、コメントいただければうれしいです!!)

まず、Rails2.0のroutes.rbでは、以下の6種類のRoutingの書き方があります。

LANG : RUBY
  1. map.connect
  2. map.purchase(任意のパス名)
  3. map.with_options
  4. map.root
  5. map.resource
  6. map.resources
  7. map.namespace

map.connectとmap.purchase

「map.connect」と「map.purchase」はrails1.x系からおなじみですね。

「map.connect」と「map.purchase(任意のパス名)」については、2005年の情報ですが「Routes :: 優しいRailsの育て方 :: ヽ( ・∀・)ノくまくまー)」によくまとめられています。くまくまさんにはいつもおせわになってます。

またパラメータにURLを直接渡したい場合は、「routes.rbでURLを丸ごとパラメータとして渡す記述法 - Hello, world! - s21g」が参考になります。

僕は今のところ利用する機会が無いですが、パラメータを省略可能にしたい場合は「routes.rbで省略可能パラメータを指定する方法 - Hello, world! - s21g」を。

map.with_options

「map.with_options」は、コントローラ名などのオプションを一度にまとめて指定するときに使います。

LANG : RUBY
  1. map.with_options :controller => 'blog' do |blog|
  2.   blog.show '',          :action => 'list'
  3.   blog.rss1 'index.xml', :action => 'feed', :format => 'rss1'
  4.   blog.rss2 'index.rdf', :action => 'feed', :format => 'rss2'
  5.   blog.atom 'atom.xml',  :action => 'feed', :format => 'atom'
  6. end

the { buckblogs :here }: Object#with_options」を読むと、with_optionsはActiveSupportのメソッド(Object#with_options)なので、ActiveRecord::Baseの中でも使えるようです。

map.root

僕がいつも指定している「root_path」の指定の仕方は、以下の通り。map.rootはrails1.2の時には無かったような気もしますが、いつのまに加わってたんだろう?これは便利。

LANG : RUBY
  1. map.root :controller => 'top'

ちなみにrails1.2では

LANG : RUBY
  1. map.root "/", :controller => 'top'

と書いていました。

map.rootだったりmap.indexだったり、ルートの名前が人によって変わってたので、map.rootに統一されたのはいい傾向ですね。(ちなみに僕はmap.index派だったので、ついつい書き間違えます。)

map.resouceとmap.resources

「map.resouce」と「map.resources」については、翻訳されているリファレンスを見ています。
Module: ActionController::Resources(翻訳版)
Module: ActionController::Resources(原版)

map.resoucesに付与できるオプションには、以下のようなものがあります。

LANG : RUBY
  1. # コントローラを指定
  2. :controller => "controller_name"
  3.  
  4. # new_***やedit_***など、単数形が用いられるルート名に対して、コントローラの単数形を指定する。
  5. :singular => "singular_controller_name"
  6.  
  7. # ルートパスの接頭語を指定する。
  8. :path_prefix => "/prefix_path"
  9.  
  10. # ルート名の接頭語を指定する。(慣習的に最後は"_"で終わる)
  11. :name_prefix => "prefix_"
  12.  
  13. # index, new, edit, create, update, destroy以外のアクションを追加する。
  14. :collection => { :action1 => :get }
  15. :member => { :action2 => :post }
  16. :new => { :action3 => :any }
  17.  
  18. # collection:複数のレコード(リスト)に関するaction限定
  19. # member:特定のレコード(インスタンス)に関するaction限定
  20. # new:新規作成途中のデータに関するaction限定
  21.  
  22. # map.resouces :blogs, :has_many => :entries
  23. # で
  24. # /blogs/:blog_id/entries/:id/edit
  25. # という形のアクセスを可能にする。
  26. :has_one
  27. :has_many

なるべく「:collection/:member/:new」よりは「:has_one/:has_many」を使う方が良い気がします。

まだmap.resourceやmap.resourcesを使って複雑なアプリを作ったことが無いので、リソースがネストする状況は経験したことが無いのですが、これはなかなか便利そうなのでメモ。
天使やカイザーと呼ばれて: リソースが3段以上ネストしたときのmap.resourcesの書き方

map.namespace

以下の2つの記述はどちらも同じroutesの定義になります。namespaceを使っている方が、すっきりします。

僕が「map.namespace」に関して理解してるのは、name_prefixとpath_prefixを別々に使うよりはこっちを使えってことくらいです...(汗

namespaceを使った場合。

LANG : RUBY
  1. map.namespace :api do |api|
  2.   api.resources :accounts
  3.   api.resource  :hoge, :fuga
  4.   api.resources :blogs do |blog|
  5.     blog.resources :posts
  6.   end
  7. end

namespaceの代わりにpath_prefixとname_prefixを使った場合。

LANG : RUBY
  1. map.resources :accounts, :path_prefix => '/api', :name_prefix => 'api_', :controller => 'api/accounts'
  2. map.resource  :hoge, :path_prefix => '/api', :name_prefix => 'api_', :controller => 'api/hoge'
  3. map.resource  :fuga, :path_prefix => '/api', :name_prefix => 'api_', :controller => 'api/fuga'
  4. map.resources :blogs, :path_prefix => '/api', :name_prefix => 'api_' do |blog|
  5.   blog.resources :posts, :controller => 'api/posts'
  6. end

補足資料

Rails2.0のPreviewリリース

Riding Rails: Rails 2.0: Preview Release

routesの解釈のされかたを理解するには、ここを読むと良いかも。僕はここ読んでもよく理解できないんだけど(汗

RoR Wiki 翻訳 Wiki - Railsのソースを読んでみる/ルートの初期化

でも、一番いい方法は、ActionController::Routingのソースを読む。

LANG : shell etc.
  1. RUBY_HOME/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/routes.rb


この記事がお役に立ちましたら、一言コメントもらえると嬉しいですm_ _m

Posted by
shachi
2007/12/29 10am

map.xmlって書き方もあるですよ。


Posted by
NOV
2007/12/29 12pm

なるほど。
ここにあるような使い方ですね。
http://ja.elanbeat.com/articles/2006/05/15/generating-sitemap-of-typo

ちなみに「map.xml」は「map.purchase(任意のパス名)」の一種ではないのですか?


[...] 優しいRailsの育て方(routes)Rails2.0のRouting(config/routes.rb)の記述方式についてのまとめ。Ruby on Rails データベースmigration入門1 (CodeZine編集部ブログ) [...]


[...] 優しいRailsの育て方(routes)Rails2.0のRouting(config/routes.rb)の記述方式についてのまとめ。Ruby on Rails データベースmigration入門1 (CodeZine編集部ブログ) [...]


コメントはこちらから




使用可能タグ: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


« 前のエントリ
Rails2.0でのform(form_forとrender :partial => ‘form’を同時に使う方法)
次のエントリー »
Hpricotのバージョンを0.5=>0.6にあげる時の注意点(inner_textでNoMethodError)