Rails 4 - как добавить индексный маршрут для вложенного ресурса, чтобы вывести список всех элементов независимо от родительского ресурса

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

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

# 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

Однако, это не поддерживает действие: index, согласно документации.

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

1 ответ

Решение

Если вы хотите сохранить метод индекса области 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 просмотреть каталог (если у вас его нет) и index.html.erb,


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

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

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

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

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

Тогда bars контроллер может быть просто:

def index
  @bars = Bar.all
end

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

Другие вопросы по тегам