Сообщите, используется ли контроллер во вложенном маршруте в Rails 3 - PullRequest
5 голосов
/ 08 ноября 2010

Я сделал вложенный маршрут в проекте Ruby on Rails 3.со следующей маршрутизацией:

resources :companies do
   resources :projects
end

Теперь я могу получить доступ к методу индекса контроллера проекта через example.com/projects/id или example.com/companies/id/projects/id, но обе страницы отображаются точнотаким же образом.Как я могу изменить страницу проектов во втором примере, чтобы показывать только проекты, связанные с этой компанией?

Ответы [ 2 ]

10 голосов
/ 08 ноября 2010

Я бы изменил то, как вы определяете область поиска. Rails 3 прекрасен тем, что позволяет вам делать это, потому что практически все доступно для применения.

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

before_filter :find_company

# your actions go here

private

  def find_company
    @company = Company.find(params[:company_id]) if params[:company_id]
  end

Это должно быть довольно просто: найдите запись Company, идентификатор которой совпадает с той, которая была передана с вложенного маршрута. Если он не вложенный, тогда не будет params[:company_id], поэтому не будет набора переменных @company.

Далее вы хотите настроить поиск проекта в зависимости от того, установлен или нет @company. Это тоже легко. Прямо под первым before_filter поставьте вот это:

before_filter :scope_projects

Затем определите метод для этого метода find_company следующим образом:

def scope_projects
  @projects = @company ? @company.projects : Project
end

Теперь вы, вероятно, думаете "Вах" . Я знаю. Я тоже.

Теперь, где бы вы ни ссылались на ассоциацию projects или класс Project, используйте @projects. С помощью этого метода scope_projects ваше приложение будет знать, имеете ли вы в виду «все проекты, когда-либо» или «все проекты, когда-либо находящиеся в указанной компании».

Теперь, когда вы доберетесь до видов, вы можете сделать что-то вроде этого:

<h1><% if @company %><%= @company.name %>'s<% end %> Projects</h1>

Вы даже можете переместить его в помощника:

def optional_company
  if @company
    @company.name + "'s"
  end
end

И превратить эту уродливую логику в это:

<h1><%= optional_company %> Projects</h1>

Изменить при необходимости.

Надеюсь, это было полезно.

1 голос
/ 08 ноября 2010

При мощности наследованных_ресурсов вы можете иметь дополнительную вложенность со следующим контроллером:

class ProjectsController < InheritedResources::Base
  belongs_to :company, :optional => true
end 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...