判断控制器是否在Rails 3中的嵌套路由中使用

GSt*_*Sto 4 routing ruby-on-rails ruby-on-rails-3

我在Ruby on Rails 3项目中创建了一个嵌套路由.使用以下路由:

resources :companies do
   resources :projects
end
Run Code Online (Sandbox Code Playgroud)

现在我可以通过example.com/projects/id或example.com/companies/id/projects/id查看项目控制器的索引方法,但两个页面都以完全相同的方式显示.如何在第二个示例中更改项目页面以仅显示与该公司关联的项目?

Rya*_*igg 10

我会改变你的发现范围.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
Run Code Online (Sandbox Code Playgroud)

这应该是相当直接的:查找Company具有与嵌套路由传入的ID匹配的ID 的记录.如果它没有嵌套,那么就不会params[:company_id]这样,因此不会有@company变量集.

接下来,您要根据是否@company设置来查找项目查找的范围.这也很容易.在第一个下面before_filter,把这一个:

before_filter :scope_projects
Run Code Online (Sandbox Code Playgroud)

然后在方法下面为它定义方法,find_company如下所示:

def scope_projects
  @projects = @company ? @company.projects : Project
end
Run Code Online (Sandbox Code Playgroud)

现在你可能在想"WOAH".我知道.我也是.

现在无论您在哪里引用projects关联或Project类,请@projects改用.通过这种scope_projects方法的强大功能,您的应用程序将知道您的意思是"所有项目,永远"还是"所有项目,在指定公司中".

现在,当您进入视图时,您可以执行以下操作:

<h1><% if @company %><%= @company.name %>'s<% end %> Projects</h1>
Run Code Online (Sandbox Code Playgroud)

你甚至可以把它变成一个帮手:

def optional_company
  if @company
    @company.name + "'s"
  end
end
Run Code Online (Sandbox Code Playgroud)

并把那个丑陋的hunk-o-logic变成这个:

<h1><%= optional_company %> Projects</h1>
Run Code Online (Sandbox Code Playgroud)

根据需要修改.

希望这有帮助.