2015-08-01 19 views
6

Ich habe eine verschachtelte Ressource Bar, die zu Foo gehört. Ich kann erfolgreich alle Bar Objekte auflisten, die zu einem gegebenen Foo gehören. Aber ich möchte auch in der Lage sein, eine Ansicht mit allen Bar Elementen zu erstellen, die zusammen aufgelistet sind, von jedem Objekt, dem sie angehören.Rails 4 - Wie füge ich eine Indexroute für eine verschachtelte Ressource hinzu, um alle Elemente unabhängig von der übergeordneten Ressource aufzulisten

Die Modellstruktur ist:

# app/models/foo.rb 
class Foo < ActiveRecord 
    has_many :bars 
end 

# app/models/bar.rb 
class Bar < ActiveRecord 
    belongs_to :foo 
end 

Das Routing ist definiert als:

# config/routes.rb 
resources :foos do 
    resources :bars 
end 

ich die erwarteten Routen aus dieser Konfiguration erhalten:

foo_bars GET /foos/:foo_id/bars(.:format)  bars#index 
      POST /foos/:foo_id/bars(.:format)  bars#create 
new_foo_bar GET /foos/:foo_id/bars/new(.:format) bars#new 
    edit_bar GET /bars/:id/edit(.:format)   bars#edit 
     bar GET /bars/:id(.:format)    bars#show 
      PATCH /bars/:id(.:format)    bars#update 
      PUT /bars/:id(.:format)    bars#update 
      DELETE /bars/:id(.:format)    bars#destroy 
     foos GET /foos(.:format)     foos#index 
      POST /foos(.:format)     foos#create 
    new_foo GET /foos/new(.:format)    foos#new 
    edit_foo GET /foos/:id/edit(.:format)   foos#edit 
     foo GET /foos/:id(.:format)    foos#show 
      PATCH /foos/:id(.:format)    foos#update 
      PUT /foos/:id(.:format)    foos#update 
      DELETE /foos/:id(.:format)    foos#destroy 

Was ich brauche, ist zu Erstellen Sie eine Route für bars#index, die im Rahmen vonnicht beschränkt ist. Mit anderen Worten, ich möchte im Wesentlichen:

bars GET /bars(.:format)  bars#index 

Ich habe versucht, die flache Option, also: Index Aktion, pro den documentation:

# config/routes.rb 
resources :foos, shallow: true do 
    resources :bars 
end 

Dies ist jedoch nicht die nicht unterstützt.

Was ist der beste Weg, dies zu tun? Es gibt eine hilfreiche Stack Overflow-Diskussion here, mit einem before_filter, um den Umfang zu bestimmen - aber es ist von 2009. Schätzen Sie jede spezifische Anleitung, wie Sie den Controller und die config/routes.rb Datei entsprechend einrichten!

+0

Hinzufügen 'Ressourcen: Bars' separat funktioniert nicht? –

Antwort

4

Wenn Sie die scoped Index-Methode halten foo_bars und einen separaten bars Weg/Ausblick:

Erstellen einer benutzerdefinierten Route in routes.rb:

get 'bars' => 'bars#index', as: :bars 

Richten Sie Ihre Index-Methode in Ihrem bars Controller als in Ihrem Link beschrieben oder einfach:

def index 
    if params[:foo_id] 
    @bars = Foo.find(params[:foo_id]).bars 
    else 
    @bars = Bar.all 
    end 
end 

Dann eine bars Ansicht dir erstellen Ectory (wenn Sie keine haben) und index.html.erb.


Wenn Sie nicht die scoped Index-Methode foo_bars behalten möchten:

Erstellen einer benutzerdefinierten Route in routes.rb:

get 'bars' => 'bars#index', as: :bars 

Bearbeiten Sie Ihre bestehenden Strecken die verschachtelte Index auszuschließen:

resources :foos do 
    resources :bars, except: :index 
end 

Dann die bars contr oller könnte nur sein:

def index 
    @bars = Bar.all 
end 

Dann ein bars Ansicht Verzeichnis erstellen (wenn Sie keine haben) und index.html.erb.