2011-12-13 3 views
0

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

Например

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

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

Я мог:

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

cars_path(make: 'Acura') 

и дал бы мне/автомобили/сделать = Acura

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

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

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

Любое предложение о том, что является самым «rails-y» способом сделать это? RoR 3.1

ответ

2

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

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

resources :makes do 
    resources :cars 
end 

С помощью этих маршрутов, вы должны проверить, есть ли 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) попадет в действие индекса в make_scope/cars_controller, поэтому вам не придется беспокоиться о присутствии params [: make_id], вы просто знаете, что работаете с автомобилями делать.

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

3

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

Это имеет ряд преимуществ, среди которых:

  • URL является закладкой-состояния
  • нет сессии мастерить
  • можно повторно использовать фильтрующий Params и передать их PAGINATION ссылки и такой, чтобы иметь фильтр следует за пользователем во время поиска в порядке

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

Смежные вопросы