2015-08-01 4 views
6

У меня есть вложенный ресурс Bar, который принадлежит Foo. Я могу успешно перечислить все Bar объектов, принадлежащих к любому заданному Foo. Но я также хочу, чтобы иметь возможность создавать представление со всеми Bar элементами, перечисленными вместе, из любого объекта Foo, к которому они принадлежат.Rails 4 - как добавить индексный маршрут для вложенного ресурса, чтобы перечислить все элементы, не зависящие от родительского ресурса

Структура модели:

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

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

Маршрутизация определяется как:

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

я получить ожидаемые маршруты из этой конфигурации:

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 

Что мне нужно, чтобы генерировать маршрут для bars#index, который не ограничен областью действия в контексте foo. Другими словами, я хочу по существу:

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

Я попытался использовать неглубокую вариант, таким образом:

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

Однако это не поддерживает: индекс действия, согласно documentation.

Каков наилучший способ для этого? Существует полезное обсуждение переполнения стека here, используя before_filter, чтобы определить область действия - но это с 2009 года. Оцените любые конкретные рекомендации относительно того, как настроить как контроллер, так и файл config/routes.rb соответствующим образом!

+0

Добавление ресурсов: баров отдельно не работает? –

ответ

4

Если вы хотите сохранить контекстный индексный метод foo_bars и отдельный bars маршрута/вид:

Создать собственный маршрут в routes.rb:

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

Настройте свой индексный метод в контроллере bars как описано в вашей ссылке или просто:

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

Затем создайте bars вид реж ectory (если у вас его нет) и index.html.erb.


Если вы не хотите, чтобы сохранить контекстный индексный метод foo_bars:

Создать собственный маршрут в routes.rb:

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

Изменить существующие маршруты, чтобы исключить вложенную индекс:

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

Затем bars contr Oller может быть просто:

def index 
    @bars = Bar.all 
end 

Затем создайте каталог с bars просмотра (если вы не один) и index.html.erb.