代码之家  ›  专栏  ›  技术社区  ›  GSto

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

  •  5
  • GSto  · 技术社区  · 14 年前

    resources :companies do
       resources :projects
    end
    

    现在,我可以通过example.com/project s/id或example.com/companies/id/projects/id访问project contoller的index方法,但两个页面的显示方式完全相同。如何更改第二个示例中的“项目”页以仅显示与该公司关联的项目?

    2 回复  |  直到 14 年前
        1
  •  10
  •   Ryan Bigg Andrés Bonilla    14 年前

    我会改变你调查发现的范围。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 变量集。

    接下来,您要确定项目查找的范围,这取决于 @公司 准备好了。这也很容易。就在第一个下面 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>
    

    根据需要修改。

        2
  •  1
  •   Jason Weathered    14 年前

    以…的力量 inherited_resources 可以使用以下控制器进行可选嵌套:

    class ProjectsController < InheritedResources::Base
      belongs_to :company, :optional => true
    end