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.

Reply via email to