Rails Controller - получение действия index для отображения только определенных записей - PullRequest
0 голосов
/ 13 декабря 2011

По умолчанию контроллер rails загружает все связанные объекты в действии index.То, что я хотел бы сделать, это отобразить только определенные объекты.

Например,

У меня есть модель с именем Car (id, марка, модель, год).Я хочу, чтобы в списке были указаны только конкретные марки, в зависимости от параметра.

Есть несколько способов сделать это, я просто не уверен, что лучше.

Я мог бы:

передать параметр по ссылке:

cars_path(make: 'Acura') 

и даст мне / cars /? Make = Acura

настроить маршруты: (это кажется грязным)

match "cars/:make" => "cars#index", constraints: {make: /[A-z]{1,20}/}

или я мог бы сделать отдельное действие контроллера для этого

Любое предложение о том, какой самый "rails-y" способ сделать это?RoR 3.1

Ответы [ 2 ]

3 голосов
/ 13 декабря 2011

Обычно, когда мы говорим о фильтрации данных, я предпочитаю сохранять одно и то же действие индекса и параметры фильтрации с помощью простых старых переменных GET (без дополнительных определений маршрутов) url?key=val&key-val.

Это имеет ряд преимуществ:

  • URL может создавать закладки
  • нет сеансов возиться
  • Я могу повторно использовать параметры фильтрации и передавать их по ссылкам на нумерацию страниц, чтобы фильтр следовал за пользователем во время поиска

Я предпочитаю не делать дополнительных маршрутов, так как сложность фильтра может легко оказаться слишком высокой. Если параметров фильтра мало, и вы уверены в том, что делаете, вы можете определить дополнительные хорошие маршруты url/param/param, но я считаю, что таких случаев мало или нет.

2 голосов
/ 13 декабря 2011

Если вы просто хотите отобразить автомобили одной марки, лучший URL-адрес будет: /makes/1-Acura/cars. Таким образом, вы просто получите автомобили этой марки в контроллере автомобилей.

У вас есть таблица марок или это просто строка в вашем автомобильном столе? Я думаю, что вы должны иметь один.

resources :makes do
    resources :cars
end

На этих маршрутах вам нужно будет проверить, есть ли в действии index контроллера автомобилей параметр params [: make_id], и в этом случае вы получите такие машины:

@cars = Make.find(params[:make_id]).cars

Или вы можете настроить свои маршруты таким образом

resources :makes do
    scope :module => "make_scope" do
        resources :cars
    end
end

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

controllers
    - cars_controller.rb
    - make_scope (folder)
        - cars_controller.rb

Путь make_cars_path(@make) будет выполнять действие index в make_scope / cars_controller, поэтому вам не придется беспокоиться о наличии параметров [: make_id], вы просто будете знать, что работаете с автомобилями сделать.

В противном случае с параметрами get все в порядке. Я не думаю, что плохо определять новый маршрут, чтобы получать более симпатичные URL, хотя, в зависимости от сложности ваших фильтров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...