2015-08-01 8 views
6

Ho una risorsa nidificata Bar appartenente a Foo. Posso elencare con successo tutti gli oggetti Bar che appartengono a qualsiasi dato Foo. Ma voglio anche essere in grado di generare una vista con tutti gli articoli Bar elencati insieme, da qualunque oggetto Foo a cui appartengono.Rails 4 - come aggiungere una route di indice per una risorsa nidificata, per elencare tutti gli elementi indipendenti dalla risorsa principale

La struttura del modello è:

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

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

L'instradamento è definito come:

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

ottengo i percorsi ci si aspetta da questa configurazione:

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 

Che cosa ho bisogno è quello di generare un percorso per bars#index non compreso nell'ambito del contesto di foo. In altre parole, io voglio essenzialmente:

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

Ho provato con l'opzione superficiale, in tal modo:

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

Tuttavia, questo non supporta il: azione index, per la documentation.

Qual è il modo migliore per farlo? È disponibile una discussione Stack Overflow utile here, utilizzando un valore before_filter per determinare l'ambito, ma è del 2009. Apprezzate qualsiasi guida specifica su come impostare sia il controller che il file config/routes.rb in modo appropriato!

+0

L'aggiunta di 'risorse: barre' separatamente non funziona? –

risposta

4

Se si desidera mantenere il metodo ambito dell'indice foo_bars e un separato bars percorso/Vista:

Creare un percorso personalizzato in routes.rb:

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

scegliere il metodo di indice nel bars controller come descritto nel tuo link o semplicemente:

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

Quindi creare un dir vista bars ectory (se non ne hai uno) e index.html.erb.


Se non si desidera mantenere il metodo index ambito foo_bars:

Creare un percorso personalizzato in routes.rb:

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

modificare i percorsi esistenti per escludere l'indice nidificato:

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

Quindi il bars contr oller potrebbe essere solo:

def index 
    @bars = Bar.all 
end 

quindi creare una directory bars vista (se non si dispone di uno) e index.html.erb.

Problemi correlati