Actually, you're right, there are several ways to solve this. But I think all of them have their drawbacks.
- The one you mentionned makes it mandatory to write `form_for(AdminArticleDecorator.new(@article))` instead of the more standard and shorter `form_for([:admin, @article])` - One could also simply write a custom helper (e.g. my_admin_article_path(@article)). Problem, this doesn't work well with form_for (especially if the record exists or not). And you still cannot do `form_for([:admin, @article])`. - Overriding the base helper, and don't touch to_param def article_path(@article) super(@article.slug) end Problems: Overriding the helpers is a bit annoying because you have to keep loading the file they're defined in (every time the routing helpers are normally automatically included). And I still think this is a routing concern, and that ActiveRecord#to_param is a bit awkward. Namely, I think one should be able to write `form_for([:admin, @article])` and `form_for(@article)` and have those routed using different ids :-) Le vendredi 10 mai 2019 01:49:01 UTC+2, Rafael Mendonça França a écrit : > > > Problem : there's no easy solution to achieve this, because overriding > to_param is global. > > Have you considered wrapping the object in a decorator that changes the > `to_param` method to what you want? > > url_for(@article) > # => /articles/2019-05-my-breaking-news > > url_for(AdminArticleDecorator.new(@article)) > # => /admin/articles/12 > > class AdminArticleDecorator > def initialize(article) > @artile = article > end > > def to_param(*) > @article.id > end > end > > Rafael Mendonça França > http://twitter.com/rafaelfranca > https://github.com/rafaelfranca > > > On Thu, May 9, 2019 at 7:29 PM Romain Goyet <romai...@numworks.com > <javascript:>> wrote: > >> 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 :-) >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Ruby on Rails: Core" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to rubyonra...@googlegroups.com <javascript:>. >> To post to this group, send email to rubyonra...@googlegroups.com >> <javascript:>. >> Visit this group at https://groups.google.com/group/rubyonrails-core. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/rubyonrails-core/eac44ecb-df8d-45f2-ae8d-cb1ad04f94a1%40googlegroups.com >> >> <https://groups.google.com/d/msgid/rubyonrails-core/eac44ecb-df8d-45f2-ae8d-cb1ad04f94a1%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> For more options, visit https://groups.google.com/d/optout. >> > -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-core+unsubscr...@googlegroups.com. To post to this group, send email to rubyonrails-core@googlegroups.com. Visit this group at https://groups.google.com/group/rubyonrails-core. To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-core/1a944241-7691-44b0-b867-cb6dc0c82b60%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.