Railsでネストしたリソースのscaffoldを生成する

これは結構便利!blogにひもづくentriesのようなネストしたリソースを管理するアプリを作りたいときに、今まで手動でmodelの関係・routes・controllerのfilter・viewのurlヘルパーをを編集していたが、そこらへんを解決済みのscaffoldを生成してくれるプラグインがあった。

http://deaddeadgood.com/2008/10/8/scaffolding-nested-resources-in-rails

これを使えば、この間作ったRailsで作るログイン可能なブログシステムもたったのこれだけ!

rails blog
cd blog
script/plugin install git://github.com/technoweenie/restful-authentication.git
script/plugin install git://github.com/phorsfall/rspec_on_rails_nested_scaffold.git
script/generate authenticated user
script/generate rspec_nested_scaffold blog title:string user:belongs_to --owner user
script/generate rspec_nested_scaffold entry title:string body:text blog:belongs_to --owner blog
rake db:migrate

で出来ると思ったんだけど、routesとmodelは自分で変更する必要あり。

# config/routes.rb
...
map.resources :users, :shallow => true do |user|
  user.resources :blogs do |blog|
    blog.resources :entries
  end
end
...

# app/models/user.rb
class User < ActiveRecord::Base
  ...
  has_many :blogs
  ...
end

# app/models/blog.rb
class Blog < ActiveRecord::Base
  belongs_to :user
  has_many :entries
end

あとviewからuser:belongs_toとblog:belongs_toの部分を抜いて、ブログとエントリーへのアクセスにログイン必須のフィルターをかけてあげる必要があるけど、こりゃ大分楽になるわ。

追記

routesに:shallow => trueオプションを付けてしまうと、show, editのアクションへのurlを解決できなかった。:shallowオプションなしの一段のネストなら大丈夫。