I'd use direct 
routes: https://guides.rubyonrails.org/routing.html#direct-routes

And form_for has been deprecated for a while. Use form_with 
url: my_admin_article_path(@article).

to_param is for the most common case. You use named/direct routes for the 
rest.

On Friday, May 10, 2019 at 6:27:00 AM UTC-5, Romain Goyet wrote:
>
> 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> 
>> 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.
>>> To post to this group, send email to rubyonra...@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/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/9eac87ba-d87e-4b85-954c-e4dfe9f88e98%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to