路由的顺序是否影响访问哪个控制器?

时间:2016-03-27 19:35:46

标签: ruby-on-rails routes

在我的应用程序中,我有资助,我希望网址为root / grant_id,而不是root / grants / grant_id。我在我的路线中有这个

Rails.application.routes.draw do
  ...
  root                    'static_pages#welcome'
  # get     'home'      =>  'static_pages#home'
  get     'about'       =>  'static_pages#about'
  get     'faq'       =>  'static_pages#faq'
  get     'signup'    =>  'users#new'
  get     'login'     =>  'sessions#new'
  post    'login'     =>  'sessions#create'
  delete  'logout'    =>  'sessions#destroy'  
  get     'dashboard' => 'dashboard#index'


  resources :users do
    resources :projects
      member do
        get 'access_granted'
        put 'access_granted'
        get 'remove_access'
        put 'remove_access'
      end
  end


  resources :profiles
  resources :account_activations, only: [:edit]
  resources :password_resets, only: [:new, :create, :edit, :update]
  resource :request_access, only: [:show, :new, :create]

 resources :grants, :path => '' do
    resources :app_types do
      resources :submissions
    end
  end
  get     'grants'    =>  'grants#index'

  resources :matches

end

当我将resources :matches置于resources :grants, :path => '' do行以下时,我收到错误"无法找到Grant"我看到请求参数是 {" controller" =>" grants"," action" =>" show"," id" = >"匹配"}。当我将resources :matches放在授权行之上时,一切正常。它几乎就像授权路线中的东西不会关闭,并迫使它下面的任何线路寻找拨款控制器。一个简单的解决方案就是将所有内容保持在该行之上,但我试图理解为什么会发生这种情况。

我也注意到,即使我将授权#index定义为授权,当我搜索路由时,我看到:

 grants GET    /                 grants#index
        GET    /grants(.:format) grants#index

所以有两个问题 1.是:path => ''删除授权/部分网址的正确方法 2.为什么授权路线以下的所有内容都会被发送到拨款控制器?

1 个答案:

答案 0 :(得分:2)

来自文档:

  

Rails路由按照指定的顺序进行匹配,因此如果您有资源:照片上方的照片/投票'资源行的show action的路由将在get行之前匹配。要解决此问题,请将获取行移到资源行上方,以便首先匹配。

因此,您遇到的问题是将拨款与""匹配。表示您的拨款INDEX路线是/,您的拨款SHOW路线是/:grant_id,它将匹配任何路线。如果你想拥有这种路线(我建议反对),它必须位于路线文件的底部。

您可以在此处详细了解路线:http://guides.rubyonrails.org/routing.html