2014-03-13 2 views
5

Ich habe eine Rails 4 app, wo alle Controller und Ansichten in zwei Namensräume unterteilt sind, ein Agent gerichteten backend und eine kundenorientierte frontend:Einen Standard-Namespace für URL-Helfer in Rails 4 festlegen?

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 

, zusätzlich alle Controller von erben entweder BackendController oder FrontendController:

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

Gerade jetzt alles, was einen Pfad zu erzeugen, braucht hat mit dem Namespace, wie respond_with [:backend, @event] oder form_for [:backend, @event] vorangestellt werden.

Gibt es eine Möglichkeit, einen Standard-Namespace für URL-Helfer pro Controller festzulegen, so dass respond_with @event von einem Controller, der von BackendController erbt, automatisch den richtigen Namespace übernimmt?

+0

Genau genommen ist der Standard-Namespace der globale Namespace und es gibt keine Option, ihn zu ändern. Sie könnten den Backend-Namespace in global verschieben oder eigene Helfer einrichten, um das gewünschte Verhalten zu unterstützen. Es ist jedoch schmerzhaft, die Standardeinstellungen zu bekämpfen. – prusswan

Antwort

0

Sie können scope module: :backend anstelle von namespace :backend in Ihrer Routes-Datei verwenden.

Wenn der Modulname in der URL angezeigt werden soll, können Sie dem Oszilloskop auch eine :path-Option hinzufügen.

Betrachten Sie die folgenden Routen-Datei:

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 

Dies wird über die folgenden Routen produzieren:

   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 

Hoffnung, das hilft!

+0

Siehe auch den Rails Guide für die [Rails Routing from the Outside In] (guides.rubyonrails.org/routing.html#prefixing-the-named-route-helpers). – Raffael

+0

'Namespace 'foo'' ist nur eine Kurzschrift für ' Scope-Modul:' foo ', Pfad:' foo ', wie:' foo'' – Raffael

+0

Ich fürchte, Sie haben die Frage missverstanden. Es geht nicht um das Definieren von Routen, sondern darum, sie in URL-Helfern zu verwenden. Außerdem haben Sie bequem verschiedene Ressourcen verwendet;) Versuchen Sie Ihre Route-Datei mit nur drei Mal 'Ressourcen: Ereignisse', und Sie werden sehen, warum es nicht funktioniert. – janfoeh