odeの開発メモ日記

プログラマーやってます。今までの道のり ポケコンbasic→C(DirectX5 ネットやろうぜ)→Perl(ちょろっと)→Java→C#→Ruby→Android(Java)

名前空間付きコントローラーでの問題

たいていのサンプルだとコントローラーは1フォルダに全部作られているが、管理画面や、ユーザー画面ごとにフォルダ分けしたいとこだろう。
一応作れるみたいで、ちょいとつまづいたのでメモしときます。
(rails2.1.1で確認)


URL:XXX/u/indexにおいて

  • XXX_controller.rb(親コントローラ)
  • XXX/u_controller.rb(子コントローラ)

というファイル構成にしたい場合に
XXXの名前によって動かない場合があった。


例えばXXXがAの場合

a_controller.rb
class AController < ApplicationController
end

a/u_controller.rb
class A::UController < AController
  def index
    render :text=>"aaaa"
  end
end

XXXのフォルダ名を適当にいくつか試した結果

NGな名前

a
aa
aaa
aaaaa
ab
abcd
abcdef
b

OKな名前

admin
abcde
babc
babcde


とりあえず規則性がわからないためこのような構成の名前空間付きコントローラーは使えなそうだ。(そのうち直るかもしれないけども)
どうしても使いたい場合はroutes.rbでコントローラごとに1個ずつ書いていけばいいが大変。。
map.connect '/a/u/:action/:id', :controller=>"/a/u"


恐らくこの問題は親のコントローラー名が子のコントローラー名と重なるのが問題になると思われる。

例えばa/uというURLの場合
a/controller.rbのuメソッドなのか
a/u_controller.rbのindexメソッドなのかという問題もあるだろう。


なので下記のようなのにすることで解決した。
a/root_controller.rb(親)
a/u_controller.rb(子供)
親クラスの名前を子供の名前と重ならないようにする感じだ。
とりあえずrootって名前をつけたけどなんでもよい。

a/root_controller.rb
class A::RootController < ApplicationController
end

a/u_controller.rb
class A::UController < A::RootController 
  def index
    render :text=>"aaaa"
  end
end

これでとりあえず進めよう。


ちなみにこれの言い方ってどれがメジャーなんだろう。。
適当に思いつくもの一覧

  • 名前空間付きコントローラー
  • 階層化されたコントローラー
  • コントローラーでのフォルダの使用
  • nested controller
  • コントローラをグループ化したモジュール(RailsによるアジャイルWebアプリケーションの開発より)