【问题标题】:Basic Nested Routes (how to have nested routes and not nested routes simultaneously)基本嵌套路线(如何同时拥有嵌套路线和不嵌套路线)
【发布时间】:2012-08-10 08:04:34
【问题描述】:

我有这样的路线:

resources :users do
  resources :projects
end

我希望能够访问这样的路线:

/users/1/projects/1

/projects/1

这可能吗?我该如何设置?我在我的应用程序中遇到问题,我们希望用户能够通过 /users/:id/projects/:id 查看他们自己的项目,但也可以在其他页面上查看所有创建的项目,比如这个 /projects 或一个项目和一个 id,比如这个 /projects/:id。我觉得我错过了一些东西,我应该摆脱嵌套路线吗?或者我可以两者兼得。

【问题讨论】:

    标签: ruby-on-rails ruby routes


    【解决方案1】:

    你可以两者兼得。只需将 resources :projects 添加到您的 routes.rb 即可。 然后,在您的 ProjectsController 中,您必须执行以下操作:

    def index
      if params[:user_id]
        @projects = User.find(params[:user_id]).projects
      else
        @projects = current_user.projects
      end
    end
    

    我假设您的身份验证系统为您的控制器提供了current_user 方法(就像大多数控制器一样)

    【讨论】:

    • +1 我实现了这个并且它工作正常......我不喜欢它的一件事是我意识到我的很多代码最终都带有条件检查user_id。同样在我看来,如果没有用户,像 users_project_path 这样的路线会中断,所以我必须添加更多条件......知道任何解决方案吗?谢谢:)
    • 如果将 /projects 和 /users/:user_id/projects 统一到相同的控制器/视图太麻烦,您可以将其中一条路由发送到不同的控制器。例如,您可以使用路线的 :controller 选项来做到这一点; resources :projects, :controller => :current_user_projects 或:resources :users do resources :projects, :controller => :user_projects end
    【解决方案2】:

    根据您的需要,您当然可以同时使用这两种方式。

    resources :users do
      resources :projects 
    end
    resources :projects
    

    将在 /users/:user_id/projects/:id 和 /projects/:id 中为您提供网址。

    您可以在您的项目控制器中检查 params[:user_id] 是否存在并采取必要的措施。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多