Hi everyone!
I’ve been using rails for a while (since rails 2) but never had the opportunity to contribute. I’d like to take this opportunity to thank all contributors to Rails
Anyway, I’m running into some issue with to_param. Consider the case where you have a resource that you’d like to route using identifiers that are not the :id. Currently, the recommended way to achieve that is by overriding the #to_param method on the model. I think that’s questionable design.
Let’s consider a simple example : you want to expose the same resource at two different routes. For instance, on a blog, you’d want to route articles using a slug for SEO on public URLs, and using an id on the admin interface because you use like to use ids internally.
/articles/2019-05-my-breaking-news
/admin/articles/12
Problem : there’s no easy solution to achieve this, because overriding to_param is global.
Suggested solution : that’s actually a routing topic, so it should be solve in the routing. I suggest leveraging the “param” routing option to do this, and leave the Models alone
routes.draw do
resources :articles, param: :slug
namespace :admin do
resources :articles
end
end
Currently, this changes the name of the parameter used in the route. That’s a good start. But it has no impact on the named route helpers.
Namely, url_for(@article) will still use the :id, even though “:slug” has been specified.
I suggest to also change the named route helpers to call “@article.#{param}” if a routing param has been specified.
I hope this suggestion makes sense, just let me know