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
,