On Tuesday, August 7, 2012 11:13:56 AM UTC-5, Mohamad El-Husseini wrote:
>
> I want my helpers to generate paths using a superclass instead of the 
> subclasses. Assuming I have Owner and Member that both inherit from User, 
> rails will use the current objects class name when generating paths:
>
> Let's say current_user is a mod: <%= link_to current_user.name, 
> current_user %> will generate "/mod/:id". I want to force it to generate 
> "/user/:id" regardless of the subclass.
>
> I can name the path:
> <%= link_to current_user.name, user_path(current_user) %>
>
> But I still want to use the convenience of just passing the object:
> <%= link_to current_user.name, current_user %>
>
> Is this possible?
>
>
You didn't specify the rails version, but I'm pretty sure the answer is no. 
 In Rails 2.3.14 your link to is eventually calling url_for, which calls 
polymorphic_url (through polymorphic_path) since you're not passing it a 
String, Hash or the symbol :back (
https://github.com/rails/rails/blob/v2.3.14/actionpack/lib/action_view/helpers/url_helper.rb#L76).
 
 In turn that eventually calls build_named_route_call, which uses 
RecordIdentifier.plural_class_name(current_user), which is returning the 
class name (
https://github.com/rails/rails/blob/v2.3.14/actionpack/lib/action_controller/polymorphic_routes.rb#L154).
 
 And finally that in turn eventually calls current_user.model_name (
https://github.com/rails/rails/blob/v2.3.14/actionpack/lib/action_controller/record_identifier.rb#L100
)

You could look into overriding what model name returns for those classes, 
but that seems really far reaching and dangerous.  I'd just use the path 
helper since that best represents what you want to do, which is send an 
Owner or Member object not to /owners/:id or /members/:id but to /users/:id 
instead; ergo the verbosity doesn't seem bad to me, it helps clarify.

As an alternative, you could also define the /owners/:id and /members/:id 
routes and point them at UsersController; not sure if that's okay to have 
the extra routes, but that allows you to keep your shorthand notation, has 
that map to the expected URL, but lets you DRY the underlying controller 
class.

\Peter


-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msg/rubyonrails-talk/-/OEWb_1L040cJ.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to