【问题标题】:Rails 3.1 - How do I organize multiple index actions for the same model?Rails 3.1 - 如何为同一模型组织多个索引操作?
【发布时间】:2012-03-27 07:33:20
【问题描述】:

我有一个包含多个项目的用户模型。 Project 模型属于 User 模型。我目前正在使用 projects_controller.rb 索引操作来显示已在所有用​​户 (Project.all) 中创建的所有项目。

在单独的页面上,我还想要一种方法来显示属于特定用户的所有项目(即转到页面并能够查看属于给定用户的所有项目)。

我很难弄清楚要使用哪个控制器/动作/视图以及如何设置路由,因为我已经使用了 projects_controller 的索引动作来显示所有项目。有人有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1 routes


    【解决方案1】:

    您可以执行 /users/{:id}/projects,这将映射到用户控制器项目操作。路由必须是自定义成员操作

    resources :users do
      member do
        get 'projects'
      end
    end
    

    【讨论】:

    • 这似乎是最直接的解决方案。虽然有很多很棒的答案。谢谢!
    【解决方案2】:

    而不是有不同的列表页面。根据不同的标准(即过滤器)使用相同的索引页面。

    网址

    match ":filter/projects", :to => "projects#index"
    

    控制器内部类似

    case params[:filter]
    when "all"
      @projects = Project.all
    when "user" 
      @projects = current_user.projects
    when "batch"
      # ..
    else
      # ..
    end
    

    【讨论】:

      【解决方案3】:

      如何在User#show 页面上显示属于特定用户的项目?

      可能是这样的:

      class UsersController < ApplicationController
      
        def show
          @user = User.find(params[:id])
        end
      
        # rest of class omitted...
      

      然后您可以通过调用@user.projects 来访问属于该用户的项目在显示页面的视图中。

      【讨论】:

        【解决方案4】:

        您应该将projects 嵌套在users 下以获得工作代码/路径,例如:/users/1/projects,无需任何额外编码,因此您需要将routes.rb 中的资源行更改为:

        resources :users, :shallow => true do 
          resources :projects
        end
        

        然后在 Projects#show 操作而不是 Project.find(params[:id]) 下,您需要获取 Project.find(params[:user_id])

        这似乎是正确的

        【讨论】:

        • 这会使我用来显示所有项目的 /projects 路由不再有效吗?
        猜你喜欢
        • 1970-01-01
        • 2012-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-03
        • 1970-01-01
        • 2014-12-29
        • 2015-06-17
        相关资源
        最近更新 更多