【发布时间】:2015-09-26 08:59:44
【问题描述】:
TL;DR
我想更改 Rails 资源路由的默认行为,将所有资源的 create 路径移动到 /resources/new 而不是 /resources 的 POST。
设置
让我们假设这样指定的资源丰富的路线:
# routes.rb
resources :events
将生成的实际路线是:
$ rake routes
Prefix Verb URI Pattern Controller#Action
events GET /events(.:format) events#index
POST /events(.:format) events#create
new_event GET /events/new(.:format) events#new
edit_event GET /events/:id/edit(.:format) events#edit
event GET /events/:id(.:format) events#show
PATCH /events/:id(.:format) events#update
PUT /events/:id(.:format) events#update
DELETE /events/:id(.:format) events#destroy
注意create 操作是由 POST 到 /events 路径触发的。
现在,如果我想更改该路径,我可以根据每个资源“手动”进行:
# routes.rb
# I've placed the routes in this order, and used `as: "new_event"`,
# to avoid generating an `events_new` path helper.
post 'events/new' => 'events#create', as: "new_event"
resources :events, except: [:create]
这里是生成的路线:
$ rake routes
Prefix Verb URI Pattern Controller#Action
new_event POST /events/new(.:format) events#create
events GET /events(.:format) events#index
GET /events/new(.:format) events#new
edit_event GET /events/:id/edit(.:format) events#edit
event GET /events/:id(.:format) events#show
PATCH /events/:id(.:format) events#update
PUT /events/:id(.:format) events#update
DELETE /events/:id(.:format) events#destroy
太棒了! create 操作现在由/events/new 路径而不是/events 路径的POST 触发。
所有其他路由/助手的行为与以前完全相同 - 包括对 /events/new 的 GET 和 new_event 路径/url 助手。
问题
除了手动覆盖每个create 操作,有没有办法只更改用于该特定操作的默认路径?
如果做不到这一点,我还能使用什么其他方法来更改一堆资源丰富的路由,以便将它们的创建操作移至上述/new?
谢谢!
【问题讨论】:
-
我的猜测是你必须给 resources 打补丁才能做到这一点,但我强烈鼓励你不要这样做 - Rails 都是关于约定的,这会让其他会阅读您的代码的开发人员感到困惑。一种更明确的处理方式是使用包含修改后的发布操作的routing concern,并将
except: :create添加到每个resources调用中。 -
另外,您还可以定义一个
custom_resources方法,该方法将执行您已经手动执行的操作,在此过程中调用原始resources。 -
您第二条评论中的建议是我最终所做的。它工作得很好。如果您想将其重写为答案,我会将其标记为正确。
标签: ruby-on-rails ruby routing