Namespaced resource generation with resource_controller!


Most of the time, in my projects, I need a separated administration area: http://teste.local/admin/*

For those who doesn’t know resource_controller (r_c) yet, please visit: Restful Controllers with resource_controller. I’ll never have a Rails app not using it, that’s for sure!

The goal here is to create a resource called Post and access it using http://teste.local/admin/posts .
My first thought was to try:

1
script/generate scaffold_resource admin/Posts title:string content:text

But it created things in a way I did not like:

  • app/models/admin/posts.rb ( I really do not want my model to be in the admin folder)
  • db/migrate/20090119032314_create_admin_posts.rb / create_table :admin_posts (In fact it created a admin_posts table … :-( )

I then resigned myself to the fact that I’ll have to generate in the “normal” way and then hack the generated files to adapt to what I wanted to do. Here we go:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
script/generate scaffold_resource Posts title:string content:text
exists  app/models/
exists  app/controllers/
exists  app/helpers/
create  app/views/posts
exists  test/functional/
exists  test/unit/
create  app/views/posts/index.html.erb
create  app/views/posts/show.html.erb
create  app/views/posts/new.html.erb
create  app/views/posts/edit.html.erb
create  app/views/posts/_form.html.erb
create  app/models/posts.rb
create  app/controllers/posts_controller.rb
create  app/helpers/posts_helper.rb
create  test/functional/posts_controller_test.rb
create  test/unit/posts_test.rb
create  test/fixtures/posts.yml
create  db/migrate
create  db/migrate/20090119032942_create_posts.rb
route  map.resources :posts

I then changed the following:

1
2
3
4
app/views/posts                            to    app/views/admin/posts
app/controllers/posts_controller.rb        to    app/controllers/admin/posts_controller.rb
app/helpers/posts_helper.rb                to    app/helpers/admin/posts_helper.rb
test/functional/posts_controller_test.rb   to    test/functional/admin/posts_controller_test.rb

Don’t forget to change add Admin:: in all the .rb files that you moved.

Last thing to change is the route to the Post resource:

1
2
3
4
5
map.resources :posts
#Has to be replaced by:
map.namespace :admin do |admin|
admin.resources :posts      #Directs /admin/posts/* to Admin::PostsController (app/controllers/admin/posts_controller.rb)
end

Namespaces configuration is pretty straight forward and there is loads of articles and websites explaining it. So if you’re confused about this, google it! ;-)

That should do it. Now you can access http://teste.local/admin/posts

,

  1. #1 by Michael Kovacs on 19/01/2009 - 13:54

    You just missed it :-)

    ./script/generate scaffold_resource Admin::Posts title:string content:text

    That will do what you want out of the box

    -Michael

    Michael Kovacs’s last blog post..JavaOne 2008 – Scala

  2. #2 by Mathieu on 19/01/2009 - 18:39

    Thanks for the tip… I just tried it out, and here is the result I had:
    - The scaffold does not work out of the box
    - The Route is not using the “admin” namespace
    - The Model is still being generated int he admin folder
    - The table created is still admin_posts (that’s definitely not what I want)

    Seemed to me to be even more work to make it work the way I want. :-(

    Mathieu

(will not be published)

CommentLuv Enabled