Я бы изменил то, как вы определяете область поиска. 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>
Изменить при необходимости.
Надеюсь, это было полезно.