> > I'd use direct routes: > https://guides.rubyonrails.org/routing.html#direct-routes >
Yes, I think that'd be another solution :-) One problem I have with direct routes is that they don't seem to appear when doing "rake routes" though… Also, you lose the conveniency and conciseness of RESTful routes. > And form_for has been deprecated for a while. Use form_with > url: my_admin_article_path(@article). > Allright, I will. But correct me if I'm wrong: this won't handle the POST/PATCH method dispatch depending on wether @article is persisted, will it? > to_param is for the most common case. You use named/direct routes for the > rest. > I guess that's fair enough :) Still, I still think I had a point regarding the "param" option in restful routes. Let's consider a simple example : `resource :articles, param: :slug`. This will generate routes such as "edit_article GET /articles/:slug/edit".Now in this case, I *really* think `edit_article_path(@article)` should generate "/articles/#{@article.slug}/edit" instead of "/articles/#{@article.id}/edit" Would you guys consider merging a PR that would do this? Or do you guys think I'm just wrong? > > 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/15b679da-3536-4152-b8fb-51d7a54b687e%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.