我会更改您查找结果的范围。 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 记录,其 ID 与从嵌套路由传入的 ID 匹配。如果它没有嵌套,则不会有 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>
根据需要修改。
希望这对您有所帮助。