繁体   English   中英

自定义Rails的默认资源路由路径

[英]Customize Rails' Default Resourceful Route Path

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操作现在由POST到/events/new路径而不是/events路径触发。

每个其他路由/帮助程序的行为与以前完全相同 - 包括对/events/new的GET以及new_event路径/ url帮助程序。


问题

而不是手动覆盖每个create操作,有没有办法只更改用于该特定操作的默认路径?

如果做不到这一点,我可以用什么其他方法来改变一堆资源丰富的路线,这样他们的创建动作就会被移到/new如上所述?

谢谢!

您可以通过添加一个在一个地方为您覆盖的模块来简化您的生活。 例如:

module MyResources
  def my_resources(resource_name, opts = {}, &block)
    opts = opts.merge(except: [:create])

    resources(resource_name, opts, &block)
    post "#{resource_name}/new" => "#{resource_name}#create", as: "new_{resource_name}"    
  end
end

ActionDispatch::Routing::Mapper.__send__ :include, MyResources

然后在您的routes.rb中,您可以执行以下操作:

my_resources :events

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM