【问题标题】:Overriding params in nested routes覆盖嵌套路由中的参数
【发布时间】:2015-08-29 09:30:52
【问题描述】:

我希望我的路线命名约定保持一致。对于任何资源,默认参数是 :id。但是,如果在其中嵌套另一个资源,则父资源的参数将更改为:parent_id。 我的路由看起来像:

resources :users do
  resources :projects do
    resources :issues
  end
end

对于用户模型,它将生成类似 :id 的 url,对于项目 url 将是 :user_id/:id,对于问题 url 将是 :user_id/:project_id/:id。我试图重载this之后的默认参数

resources :users, param: :user_id do
  resources :projects, param: :project_id do
    resources :issues, param: :issue_id
  end
end

它会生成如下 URL::user_user_id/:project_project_id/:issue_id。由于我要覆盖它,因此我希望关闭父资源的默认附加。我希望我的路线看起来像 :user_id/:project_id/:issue_id 并且我希望它对于所有模型都是一致的。即项目应该映射到:user_id/:project_id

【问题讨论】:

    标签: ruby-on-rails routing actiondispatch


    【解决方案1】:

    我就是这样做的...不确定是否有更好的方法,但它应该可以解决问题...

    resources :users, param: :user_id
    
    resources :users, only: [] do
      resources :projects, param: :project_id
    end
    
    resources :users, only: [] do
      resources :projects, only: [] do
        resources :issues, param: :issue_id
     end
    end
    

    【讨论】:

      【解决方案2】:

      试试member:

      resources :users, param: :user_id do
        member do
          resources :projects, param: :project_id do
            member do
              resources :issues, param: :issue_id
            end
          end
        end
      end
      

      此代码将生成以下路径:

            issues GET    /users/:user_id/projects/:project_id/issues(.:format)                issues#index
                   POST   /users/:user_id/projects/:project_id/issues(.:format)                issues#create
         new_issue GET    /users/:user_id/projects/:project_id/issues/new(.:format)            issues#new
        edit_issue GET    /users/:user_id/projects/:project_id/issues/:issue_id/edit(.:format) issues#edit
             issue GET    /users/:user_id/projects/:project_id/issues/:issue_id(.:format)      issues#show
                   PATCH  /users/:user_id/projects/:project_id/issues/:issue_id(.:format)      issues#update
                   PUT    /users/:user_id/projects/:project_id/issues/:issue_id(.:format)      issues#update
                   DELETE /users/:user_id/projects/:project_id/issues/:issue_id(.:format)      issues#destroy
          projects GET    /users/:user_id/projects(.:format)                                   projects#index
                   POST   /users/:user_id/projects(.:format)                                   projects#create
       new_project GET    /users/:user_id/projects/new(.:format)                               projects#new
      edit_project GET    /users/:user_id/projects/:project_id/edit(.:format)                  projects#edit
           project GET    /users/:user_id/projects/:project_id(.:format)                       projects#show
                   PATCH  /users/:user_id/projects/:project_id(.:format)                       projects#update
                   PUT    /users/:user_id/projects/:project_id(.:format)                       projects#update
                   DELETE /users/:user_id/projects/:project_id(.:format)                       projects#destroy
             users GET    /users(.:format)                                                     users#index
                   POST   /users(.:format)                                                     users#create
          new_user GET    /users/new(.:format)                                                 users#new
         edit_user GET    /users/:user_id/edit(.:format)                                       users#edit
              user GET    /users/:user_id(.:format)                                            users#show
                   PATCH  /users/:user_id(.:format)                                            users#update
                   PUT    /users/:user_id(.:format)                                            users#update
                   DELETE /users/:user_id(.:format)                                            users#destroy
      

      但是,请注意助手与接受的答案中的不同。

      您可以使用“as”选项来避免这种情况。更敏捷的解决方案在这里:https://stackoverflow.com/a/41323489/2405850

      【讨论】:

      • 您还可以将资源包装在 scope(as: :project) 中以更正 url_helpers。此解决方案优于接受的解决方案,因为它允许将参数键更改为任何内容,即使它不包含父资源名称
      【解决方案3】:

      在 routes.rb 中尝试这些路线

        resources :users, :key => :user_id do
          resources :projects, :key => :project_id do
            resources :issues, :key => :issue_id
          end
        end
      

      【讨论】:

      • 对不起 Haider,但它只在参数列表中添加了一个键:Parameters: {"key"=>:project_id, "user_id"=>"addie", "id"=>"new_project"}
      • @sonalkr132 你想把`/customers/:customer_id/projects/:project_id/issues` 转换成`/:user_user_id/:project_project_id/:issue_id` ????
      • 不!我想要反过来。即:user_user_id/:project_project_id/:issue_id:user_id/:project_id/:issue_id。覆盖参数生成前者。
      • @sonalkr132 目前您在 routes.rb 中定义的内容将产生类似于 /users/:user_id/projects/:project_id/issues/:id 的路线,而不是您所说的 :user_user_id/:project_project_id/:issue_id
      • 我知道。我希望它看起来像 users/:user_id/projects/:project_id/issues/:issue_id 并且我希望所有情况下的 param 名称都相同。即users/:user_id/projects/:project_iduser/:user_id。我试图通过覆盖不起作用的参数来实现它。
      猜你喜欢
      • 2015-11-23
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 2011-12-01
      • 2017-04-04
      • 2018-04-07
      相关资源
      最近更新 更多