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 ![]()