Rails2.0のRouting(config/routes.rb)の記述方式についてのまとめ。
なんだかRails2.0になってから、routes.rbの書き方を毎回Googleさんに聞いている気がしたので、ちょっとまとめておきます。
(この他にも、routesの記述方式についての有用な情報があれば、コメントいただければうれしいです!!)
まず、Rails2.0のroutes.rbでは、以下の6種類のRoutingの書き方があります。
-
map.connect
-
map.purchase(任意のパス名)
-
map.with_options
-
map.root
-
map.resource
-
map.resources
-
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」は、コントローラ名などのオプションを一度にまとめて指定するときに使います。
-
map.with_options :controller => 'blog' do |blog|
-
blog.show '', :action => 'list'
-
blog.rss1 'index.xml', :action => 'feed', :format => 'rss1'
-
blog.rss2 'index.rdf', :action => 'feed', :format => 'rss2'
-
blog.atom 'atom.xml', :action => 'feed', :format => 'atom'
-
end
「the { buckblogs :here }: Object#with_options」を読むと、with_optionsはActiveSupportのメソッド(Object#with_options)なので、ActiveRecord::Baseの中でも使えるようです。
map.root
僕がいつも指定している「root_path」の指定の仕方は、以下の通り。map.rootはrails1.2の時には無かったような気もしますが、いつのまに加わってたんだろう?これは便利。
-
map.root :controller => 'top'
ちなみにrails1.2では
-
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に付与できるオプションには、以下のようなものがあります。
-
# コントローラを指定
-
:controller => "controller_name"
-
-
# new_***やedit_***など、単数形が用いられるルート名に対して、コントローラの単数形を指定する。
-
:singular => "singular_controller_name"
-
-
# ルートパスの接頭語を指定する。
-
:path_prefix => "/prefix_path"
-
-
# ルート名の接頭語を指定する。(慣習的に最後は"_"で終わる)
-
:name_prefix => "prefix_"
-
-
# index, new, edit, create, update, destroy以外のアクションを追加する。
-
:collection => { :action1 => :get }
-
:member => { :action2 => :post }
-
:new => { :action3 => :any }
-
-
# collection:複数のレコード(リスト)に関するaction限定
-
# member:特定のレコード(インスタンス)に関するaction限定
-
# new:新規作成途中のデータに関するaction限定
-
-
# map.resouces :blogs, :has_many => :entries
-
# で
-
# /blogs/:blog_id/entries/:id/edit
-
# という形のアクセスを可能にする。
-
:has_one
-
: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を使った場合。
-
map.namespace :api do |api|
-
api.resources :accounts
-
api.resource :hoge, :fuga
-
api.resources :blogs do |blog|
-
blog.resources :posts
-
end
-
end
namespaceの代わりにpath_prefixとname_prefixを使った場合。
-
map.resources :accounts, :path_prefix => '/api', :name_prefix => 'api_', :controller => 'api/accounts'
-
map.resource :hoge, :path_prefix => '/api', :name_prefix => 'api_', :controller => 'api/hoge'
-
map.resource :fuga, :path_prefix => '/api', :name_prefix => 'api_', :controller => 'api/fuga'
-
map.resources :blogs, :path_prefix => '/api', :name_prefix => 'api_' do |blog|
-
blog.resources :posts, :controller => 'api/posts'
-
end
補足資料
Rails2.0のPreviewリリース
Riding Rails: Rails 2.0: Preview Release
routesの解釈のされかたを理解するには、ここを読むと良いかも。僕はここ読んでもよく理解できないんだけど(汗
RoR Wiki 翻訳 Wiki - Railsのソースを読んでみる/ルートの初期化
でも、一番いい方法は、ActionController::Routingのソースを読む。
-
RUBY_HOME/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/routes.rb












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