Как отфильтровать действие списка в Rails, используя именованные маршруты? - PullRequest
1 голос
/ 23 марта 2011

Учитывая, что у меня есть две модели: company и locationcompany есть много locations.
Я нашел Именованные маршруты Райана Бейтса очень интересно.
Поэтому я добавил ресурсы для каждой моей модели в routes.rb.

resources :companies
resources :locations

Это позволяет мне генерировать ссылки на основе именованных маршрутов, таких как <%= link_to "Companies", companies_path %>, что приводит к http://localhost:3000/companies.

Теперь я хочу отфильтровать список locations на основе company, которые онипринадлежать.Перед работой с именованными маршрутами я выполнил это, добавив ссылку, подобную следующей.

<%= link_to "Locations for this company", { :controller => 'locations', :action => 'list', :company_id => company.id } %>

Здесь я передаю company_id в LocationsController, который фильтрует местоположение в его действии list.

def list
  @locations = Location.order("locations.id ASC").where(:company_id => @company.try(:id))
end

Ответы [ 2 ]

2 голосов
/ 23 марта 2011

Один вариант:

  resources :companies do
    get :list, :controller => :locations
  end

создаст этот маршрут:

   company_list GET    /companies/:company_id/list(.:format) {:action=>"list", :controller=>"locations"}

И это обеспечит вас вспомогательным методом company_list.

Это, однако,

  resources :companies do
    get :list, :controller => :locations
    resources :locations
  end

также предоставит вам помощника company_locations, который вместо этого указывает на действие index в LocationsController вместо list.

 company_locations GET    /companies/:company_id/locations(.:format)          {:action=>"index", :controller=>"locations"}

Последний более RESTful, но вы разработчик, так что вы сами решаете, какое наименование поможет вам больше.

Недостатком является то, что большинство действий / помощников на вашем контроллере Locations теперь зависят от наличия: company_id или инстанцированной модели компании, прикрепленной к ним.

EDIT

3-й вариант:

resources :companies do
  get :list, :controller => :locations
end
resources :locations

Это кажется лучшим, так как кроме маршрута 'company_list', вы не утверждаете, что вам особенно нужны места, отфильтрованные по компании.

2 голосов
/ 23 марта 2011

В зависимости от того, что должна делать ваша модель местоположения, я бы предложил использовать вложенные ресурсы;

resources :companies do   
    resources :locations 
end

Затем выполните рейк-маршруты, которые дадут вам все виды новых, более хороших маршрутов, например:

компания / id / местонахождение

...