Problem with overriding URL helper methods

Hi,

I've got troubles overriding some Rails generated URL helpers... My site allows registered users to create some kind of diagrams online, and then to browse all created diagrams, etc. I've got a route to access a diagram created by a user: map.diagram ':owner_id/:id', :controller => 'diagrams', :action => 'show'

When I want to have a link or redirect to a diagram, I'm currently doing this: redirect_to diagram_path(diagram.owner, diagram) -- so that :owner_id and :id are correctly set

I want to do something so that diagram_path(diagram) would generate the correct URL with diagram's owner id and diagram's id.

What I have tried to do is to rename my route: map.full_diagram ':owner_id/:id', :controller => 'diagrams', :action => 'show'

and then in DiagramsHelper, to override diagram_path and diagram_url like this:   def diagram_path(diagram, *args)     full_diagram_path(diagram.owner, diagram, *args)   end

It's working well, except for one thing: the method is not available in my controllers. Though I've got "helpers :all" in ApplicationController. So, in a view, diagram_path(diagram) would give "/olance/27", whereas a redirect_to diagram_path(diagram) in a controller would redirect to "/diagrams/27".

If I copy my overriden methods in application_controller.rb, then it does work. So I really don't get it, why would my helpers not be included?

Is there a better way to do what I'm trying to achieve? I might have missed something in the routes mechanisms... nested routes maybe? I'm using Rails 2.3.8 by the way.

Thanks a lot, Olivier

Olivier Lance wrote:

Hi,

I've got troubles overriding some Rails generated URL helpers... My site allows registered users to create some kind of diagrams online, and then to browse all created diagrams, etc. I've got a route to access a diagram created by a user: map.diagram ':owner_id/:id', :controller => 'diagrams', :action => 'show'

When I want to have a link or redirect to a diagram, I'm currently doing this: redirect_to diagram_path(diagram.owner, diagram) -- so that :owner_id and :id are correctly set

I want to do something so that diagram_path(diagram) would generate the correct URL with diagram's owner id and diagram's id.

What I have tried to do is to rename my route: map.full_diagram ':owner_id/:id', :controller => 'diagrams', :action => 'show'

and then in DiagramsHelper, to override diagram_path and diagram_url like this:   def diagram_path(diagram, *args)     full_diagram_path(diagram.owner, diagram, *args)   end

It's working well, except for one thing: the method is not available in my controllers. Though I've got "helpers :all" in ApplicationController. So, in a view, diagram_path(diagram) would give "/olance/27", whereas a redirect_to diagram_path(diagram) in a controller would redirect to "/diagrams/27".

If I copy my overriden methods in application_controller.rb, then it does work. So I really don't get it, why would my helpers not be included?

Is there a better way to do what I'm trying to achieve? I might have missed something in the routes mechanisms... nested routes maybe? I'm using Rails 2.3.8 by the way.

Thanks a lot, Olivier

Looks like nested routes would be a better approach for this

You'd need map.resources :owner, :has_many => diagrams

This would create this type of restful route owner_diagrams_path route_owner_diagram_path(@owner, @diagram) etc Once you have the route.rb file in place, you can run rake routes from rails_root to see all available routes

Luis Saffie wrote:

Looks like nested routes would be a better approach for this

You'd need map.resources :owner, :has_many => diagrams

This would create this type of restful route owner_diagrams_path route_owner_diagram_path(@owner, @diagram) etc Once you have the route.rb file in place, you can run rake routes from rails_root to see all available routes

Thanks for your reply! I'll certainly try going this way... however, do you have any idea about this overriding thing? I'd like to understand why my views can use my overriden methods but not my controllers... :\

Olivier Lance wrote:

Luis Saffie wrote:

Looks like nested routes would be a better approach for this

You'd need map.resources :owner, :has_many => diagrams

This would create this type of restful route owner_diagrams_path route_owner_diagram_path(@owner, @diagram) etc Once you have the route.rb file in place, you can run rake routes from rails_root to see all available routes

Thanks for your reply! I'll certainly try going this way... however, do you have any idea about this overriding thing? I'd like to understand why my views can use my overriden methods but not my controllers... :\

Helpers are made for views and not controllers. However, you can still use them in your controller. Not sure whats up in your case but you can do a quick google search for rails using helpers in controllers

Luis Saffie wrote:

Olivier Lance wrote:

Luis Saffie wrote:

Looks like nested routes would be a better approach for this

You'd need map.resources :owner, :has_many => diagrams

This would create this type of restful route owner_diagrams_path route_owner_diagram_path(@owner, @diagram) etc Once you have the route.rb file in place, you can run rake routes from rails_root to see all available routes

Thanks for your reply! I'll certainly try going this way... however, do you have any idea about this overriding thing? I'd like to understand why my views can use my overriden methods but not my controllers... :\

Helpers are made for views and not controllers. However, you can still use them in your controller. Not sure whats up in your case but you can do a quick google search for rails using helpers in controllers

I partly agree with that... Helpers are made for views indeed, but who's ever been doing a controller without any URL helper? That's maybe why my overridden ones aren't in my controllers, maybe they're not Helpers as other view helpers? I'll try to figure that out...

Another thing now... I'm using acts_as_commentable and I have a comments controller that can create a comment and associate it to any commendable model. I'm using polymorphic_path to redirect to the model show page once the comment is added. How can I still do this with a nested route, which will require owner plus model's id, when any other model pah would just require the model's id?! (that's why I came to the override at first)

Thanks again! Olivier