名前空間付きコントローラーでの問題
たいていのサンプルだとコントローラーは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
これでとりあえず進めよう。
ちなみにこれの言い方ってどれがメジャーなんだろう。。
適当に思いつくもの一覧