2015-08-01 13 views
6

Mam zagnieżdżony zasób Bar należący do Foo. Mogę wyświetlić listę wszystkich obiektów Bar należących do danego Foo. Ale chcę również móc wygenerować widok ze wszystkimi wymienionymi razem obiektami Bar, z dowolnego obiektu, do którego należą.Szyny 4 - jak dodać trasę indeksu dla zagnieżdżonego zasobu, aby wyświetlić listę wszystkich elementów niezależnych od zasobu nadrzędnego

Struktura modelu jest:

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

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

Routing jest zdefiniowany jako:

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

uzyskać oczekiwanych tras z tej konfiguracji:

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 

Co potrzebne jest do wygenerować trasę dla bars#index, która nie jest objęta zakresem w kontekście foo. Innymi słowy, w istocie chcą:

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

Próbowałem przy użyciu płytkie opcję, a więc:

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

Jednak to nie obsługuje: akcji indeksu, za tym documentation.

Jaki jest najlepszy sposób na zrobienie tego? Istnieje przydatna dyskusja Stack overflow here, przy użyciu before_filter do określenia zasięgu - ale jest to od 2009 roku. Doceń wszelkie konkretne wskazówki, jak poprawnie skonfigurować zarówno kontroler, jak i plik config/routes.rb!

+0

Dodanie 'resources: bars' oddzielnie nie działa? –

Odpowiedz

4

Jeśli chcesz zachować scoped metody indeksu foo_bars i oddzielną bars trasy/konferencyjne

utworzyć niestandardową trasę w routes.rb:

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

Skonfiguruj metodę index w kontrolerze bars jako opisane w linku lub po prostu:

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

Następnie utwórz katalog widokowy bars ectory (jeśli go nie masz) i index.html.erb.


Jeśli nie chcesz zachować scoped metody indeksu foo_bars:

utworzyć niestandardową trasę w routes.rb:

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

edytować istniejące trasy wykluczyć indeks zagnieżdżony:

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

Następnie bars kontr Oller może być tylko:

def index 
    @bars = Bar.all 
end 

Następnie należy utworzyć katalog bars widzenia (jeśli nie masz) i index.html.erb.

Powiązane problemy