[QUESTION] How to have different routes ids on different routes for the same resources?

瀏覽次數:37 次
跳到第一則未讀訊息

Maurizio De Santis

未讀,
2017年3月21日 下午1:28:402017/3/21
收件者:Ruby on Rails: Talk
Hello,

I have never found a good solution for the following problem. I have the usual structure:

resources :contents

namespace :admin do
  resources :contents
end

When I call content_path(content) I want the id to be the slug of the content, while when I call admin_content_path(content) I want the id to be the id of the content. I just want the id not to be related on the model (actually the id is the returning value of the to_param method of the model), but on the route.

I know I can write admin_content_path(id: content.id) or content_path(id: content.slug), but this is just an hack actually. Also, this is especially annoying in form_for, since I can't write

form_for @content

but I'm forced to use

form_for @content, url: @content.new_record? ? admin_contents_path : admin_contents_path(id: @content.id)


André Orvalho

未讀,
2017年4月20日 上午9:49:552017/4/20
收件者:Ruby on Rails: Talk
I don't think it is an hack what you are doing.

To actually have routes receiving different types of ids you probably needed to change how those helpers are generated by rails.
That means you might have to monkey patch rails.

The alternative rails is giving you to be able to do this is by doing this: admin_content_path(id: content.id)

So it allows you to pass to override the id passed as argument.

I am sorry but I dont think there is a way around this.



Maurizio De Santis

未讀,
2017年4月20日 上午10:06:342017/4/20
收件者:Ruby on Rails: Talk
I have to say that Rails is great. 5.1 introduces a wonderful feature for my need: direct http://edgeapi.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/CustomUrls.html#method-i-direct

Now in config/routes.rb I can write:

# Content model includes FriendlyId, so content_path(Content.first) calls record.to_param using the slug
resources :contents

direct 'edit_admin_content' do |record, options|
  # Here I specify to use the record id, so the resource url will fit better with admin section purposes
  options.merge controller: '/admin/contents', action: :edit, id: record.id
end

Same for actions :show, :update and :destroy. Problem solved!

André Orvalho

未讀,
2017年4月20日 上午10:11:082017/4/20
收件者:rubyonra...@googlegroups.com
Thats great!

I am glad you shared this.

batuhan...@gmail.com

未讀,
2017年4月21日 凌晨2:58:372017/4/21
收件者:Ruby on Rails: Talk
You can also do something like this If i get it right,

resources :posts, param: :slug

Maurizio De Santis

未讀,
2017年4月21日 清晨6:42:042017/4/21
收件者:rubyonra...@googlegroups.com
resources :posts, param: :slug

FWIK this just changes the name of the parameter passed to the controller, so if you write post_path(Post.first) you will have a request like /posts/#{post.to_param} but in the controller instead of have param[:id] you have param[:slug]

--

Maurizio De Santis

2017-04-20 22:27 GMT+02:00 <batuhan...@gmail.com>:
You can also do something like this If i get it right,

resources :posts, param: :slug

--
You received this message because you are subscribed to a topic in the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/rubyonrails-talk/rneoBmxG4QY/unsubscribe.
To unsubscribe from this group and all its topics, send an email to rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/ffd0916e-d658-4cb9-b24f-c4b3ebb52454%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

回覆所有人
回覆作者
轉寄
0 則新訊息