polymorphic_urls and REST routes


  With a simple STI Employee < Person, I can write in the Person view.rhtml.erb :

... link_to 'Show', person ...

and the correct controller will be call depending on the actual (concrete) type of the record. I think this is because link_to() uses polymorphic_url() internally.

However, the restful helpers, such as edit_person_path() fail to choose the correct controller and always route to the Person controller. This seems inconsistent and confusing.

How can I reroute edit_person_path() to take the polymorphic type into account, and route to the correct controller?

Is this by design or a bug?

I hope I made myself clear. Thanks, Adi

I believe this is by design.

When you say link_to(text, record), a polymorphic url is constructed depending on the model. But when you say edit_person_path, you are explicitly stating that you are dealing with Person records and that no polymorphism should take place.

I understand that when using STI you have a need for a polymorphic helper, but I don’t think changing the behavior of named routes (explicit or automatically generated) is a solution - it would just be the source of more confusion for others.

Your cup of tea would be the edit_polymorphic_path helper, as in this example I just put up: http://pastie.org/141162

  • Mislav

Hi Mislav,

  Excellent! Just what I needed. Thanks! I couldn't find it in my Rails 2.0.2 installation. I need the "Simply Helpful" plugin, right?

Thanks, Adi

No, that plugin was merged into trunk more than 8 months ago. Those methods aren’t documented because they are added dynamically by metaprogramming magic so RDoc doesn’t pick them up. I will be submitting a documentation patch for polymorphic URL helpers later today because this module was previously undocumented.

Mislav, Can you suggest how to do the exact same thing with formatted URLs? Using adish's example, something using a helper like

  edit_formatted_polymorphic_path(record, :xml)

This seems logical, but is busted in Edge (see http://dev.rubyonrails.org/ticket/8782).


I’ve already fixed it, just need to make unit tests and finish the documentation. Then I’ll submit it in one big patch.

My hero!