namespaceとrspec - コントローラは名前空間に、モデルはトップに

管理者用に "/admin/" というプレフィクスをURLにつけたいことはよくあります。
Rails3では namespace ディレクティブでそれを実現させていますが、
実はこれ、コントローラのみならずモデルまで名前空間にあることを前提にしています。

例えばscaffoldするとわかるんですが、

$ rails g scaffold admin/user name:string password:string

なんてことをすると Admin::UsersController が app/controllers/admin/ に作成されます。
しかし同時に app/models/admin/user.rb に Admin::User クラスまで定義されてしまいます。
さらに、データベースのテーブル名にも名前空間を適用しているんです。

そりゃあ「そうしてください」って命令してるんで当然なんですけど、
コントローラ(とビュー)はいいんですよ。ただね、ただですよ、
Userモデルを他で使おうとすると、Adminモジュールの下にあるのは健康的じゃないだろうと。

namespaceじゃなくてscopeを使うとなると、これまたちょっと感覚的に違う。
そこで User はトップに持ってくるんだけど、そうすると今度は form_for が使えないねってお話。

長らく悩んでいたんですが、こちらの記事にズバリ書いてありました。
form_forに配列を渡すという発想は無かった。

その後「じゃあリダイレクトは?」とも思ったんですが、
こちらも redirect_to [:admin, @user] として解決しました。

response.should redirect_to([:admin, User.last])

こんな感じ。redirect_toはコントローラでも同じです。
探し方が悪いのか設計が悪いのか……あんまり情報無かったデス。