controllerurl-routingpadrino

padrino: sub app and controller with same name produces redundant url


I have a padrino project.

I've created a sub app called "users".

I also have a model called user and a controller called users to handle the routing.

Users.controllers :users do

The issue with that is that the urls being produced and being responded to are

app.com/users/users/index etc

unless I go to each action and map it

get :index, :map => '/' do

Is there a better way of doing this?

I don't really want to put the actions in the app.rb for the app.. even though that works great. I like having the separation.

Is there anything like

Users.controllers :users do
    map '/'
end

Is there a naming convention that I can follow to create a default controller that would response to my apps root url?

I'd like to keep it in the users controller so that I can use the users_index etc

Gems included by the bundle:

activemodel (3.2.1)
activerecord (3.2.1)
activesupport (3.2.1)
arel (3.0.0)
bcrypt-ruby (3.0.1)
builder (3.0.0)
bundler (1.0.21)
haml (3.1.4)
http_router (0.10.2)
i18n (0.6.0)
mail (2.3.0)
mime-types (1.17.2)
multi_json (1.0.4)
padrino (0.10.6.c)
padrino-admin (0.10.6.c)
padrino-cache (0.10.6.c)
padrino-core (0.10.6.c)
padrino-gen (0.10.6.c)
padrino-helpers (0.10.6.c)
padrino-mailer (0.10.6.c)
polyglot (0.3.3)
rack (1.4.1)
rack-protection (1.2.0)
rack-test (0.6.1)
rake (0.9.2.2)
sass (3.1.13)
shoulda (2.11.3)
sinatra (1.3.2)
sinatra-flash (0.3.0)
sqlite3 (1.3.5)
thor (0.14.6)
tilt (1.3.3)
treetop (1.4.10)
tzinfo (0.3.31)
url_mount (0.2.1)

If I have to map the path for each action in the controller when my app name matches my controller name, that's fine. I was just wondering if there was a way to set the base or root path for all my actions via the controller.

Thanks


Solution

  • #padrino-core-0.10.6.c/lib/padrino-core/application/routing.rb
    
    #around line 655
    #method parse_route
    
    #right after unless controller.empty? i added the following which works in my case
    
       if controller.last.downcase == app_name.downcase and map.blank?
        controller = controller.slice(0, -2) unless controller.length == 1
        controller_path = controller.join("/")
        path.gsub!(%r{^\(/\)|/\?}, "")
        map = File.join(controller_path, path)
    end
    

    So now if I have an application called Users and a controller called Users to handle the routes, I can just say /users or /users/new etc instead of /users/users/new.

    Again, I'm very new to this, so I have no idea if this is the best way to handle this. I could have just set the map manually in each route, but that would be very annoying.

    I'm hoping that DAddYE can weight in on this and provide a better recommendation.