【问题标题】:Setting a default namespace for URL Helpers in Rails 4?在 Rails 4 中为 URL 助手设置默认命名空间?
【发布时间】:2014-03-13 13:20:40
【问题描述】:

我有一个 Rails 4 应用程序,其中所有控制器和视图都分为两个命名空间,一个面向代理的 backend 和一个面向客户的 frontend

MyApp::Application.routes.draw do
  constraints subdomain: "admin" do
    namespace :backend do
      resources :events
    end
  end

  constraints subdomain: /.+/ do                
    namespace :frontend do
      resources :events
    end
  end
end

此外,所有控制器都继承自 BackendControllerFrontendController

controllers
├── application_controller.rb
├── backend
│   ├── events_controller.rb
├── backend_controller.rb
├── frontend
│   └── events_controller.rb
├── frontend_controller.rb

现在需要生成路径的所有内容都必须以命名空间为前缀,例如respond_with [:backend, @event]form_for [:backend, @event]

有没有办法为每个控制器的 URL 帮助程序设置默认命名空间,以便从继承自 BackendController 的控制器调用的 respond_with @event 自动假定正确的命名空间?

【问题讨论】:

  • 严格来说,默认命名空间是全局命名空间,没有选项可以改变。您可能希望将 Backend 命名空间移动到全局,或设置您自己的助手来支持您想要的行为。但是,与默认值作斗争是很痛苦的。

标签: ruby-on-rails ruby-on-rails-4 rails-routing


【解决方案1】:

您可以在路由文件中使用scope module: :backend 代替namespace :backend

如果您希望模块名称出现在 URL 中,您也可以在范围中添加 :path 选项。

考虑以下路由文件:

Rails.application.routes.draw do

  scope module: 'backend1' do
    resources :event1
  end

  scope module: 'backend2', path: 'backend3' do
    resources :event2
  end

  namespace 'backend3' do
    resources :event3
  end

end

这将产生以下路线:

               Prefix Verb   URI Pattern                         Controller#Action
         event1_index GET    /event1(.:format)                   backend1/event1#index
                      POST   /event1(.:format)                   backend1/event1#create
           new_event1 GET    /event1/new(.:format)               backend1/event1#new
          edit_event1 GET    /event1/:id/edit(.:format)          backend1/event1#edit
               event1 GET    /event1/:id(.:format)               backend1/event1#show
                      PATCH  /event1/:id(.:format)               backend1/event1#update
                      PUT    /event1/:id(.:format)               backend1/event1#update
                      DELETE /event1/:id(.:format)               backend1/event1#destroy
         event2_index GET    /backend3/event2(.:format)          backend2/event2#index
                      POST   /backend3/event2(.:format)          backend2/event2#create
           new_event2 GET    /backend3/event2/new(.:format)      backend2/event2#new
          edit_event2 GET    /backend3/event2/:id/edit(.:format) backend2/event2#edit
               event2 GET    /backend3/event2/:id(.:format)      backend2/event2#show
                      PATCH  /backend3/event2/:id(.:format)      backend2/event2#update
                      PUT    /backend3/event2/:id(.:format)      backend2/event2#update
                      DELETE /backend3/event2/:id(.:format)      backend2/event2#destroy
backend3_event3_index GET    /backend3/event3(.:format)          backend3/event3#index
                      POST   /backend3/event3(.:format)          backend3/event3#create
  new_backend3_event3 GET    /backend3/event3/new(.:format)      backend3/event3#new
 edit_backend3_event3 GET    /backend3/event3/:id/edit(.:format) backend3/event3#edit
      backend3_event3 GET    /backend3/event3/:id(.:format)      backend3/event3#show
                      PATCH  /backend3/event3/:id(.:format)      backend3/event3#update
                      PUT    /backend3/event3/:id(.:format)      backend3/event3#update
                      DELETE /backend3/event3/:id(.:format)      backend3/event3#destroy

希望有帮助!

【讨论】:

  • 另请参阅 [Rails 从外向内路由](guides.rubyonrails.org/routing.html#prefixing-the-named-route-helpers) Rails 指南。
  • namespace 'foo' 只是scope module: 'foo', path: 'foo', as: 'foo'的简写
  • 恐怕你误解了这个问题。这不是关于定义路由,而是关于在 URL 帮助器中使用它们。此外,您还方便地使用了不同的资源;) 尝试您的路由文件只需 3 次 resources :events,您就会明白为什么它不起作用了。
猜你喜欢
  • 2011-02-09
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 2016-03-13
  • 2012-03-13
  • 2011-02-21
相关资源
最近更新 更多