Rails:对相同控制器名称的子域约束

时间:2018-03-26 02:12:36

标签: ruby-on-rails ruby-on-rails-5

如果约束是子域,在不同命名空间中具有类似命名控制器的正确方法是什么?

resources :documents
root to: 'documents#index'

constraints subdomain: 'test' do
  scope module: 'test' do
    resources :documents
    root to: 'documents#index' # this should hit the controller inside a module subfolder
  end
end

是否应该将http://localhost:3000/documents引用至DocumentsControllerhttp://test.localhost:3000/documentsTest::DocumentsController?我错过了什么?目前后者只是前往前者。两个控制器都存在于正确的位置,即DocumentsController位于/controllers,而命名空间位于/controllers/test

命名空间它也将它返回到错误的控制器:

constraints subdomain: 'test' do
  namespace :test, path: nil do
    scope module: 'test' do
      resources :documents
      root to: 'documents#index'
    end
  end
end

1 个答案:

答案 0 :(得分:1)

根据Rails Routing Guide

  

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

所以,我相信你的例子,你应该将约束路线移到非约束路线之上,这样他们就有机会先匹配,然后你就会倒退"如果您不在子域中,则访问非约束文档资源。

constraints subdomain: 'test' do
  scope module: 'test' do
    resources :documents
    root to: 'documents#index' # this should hit the controller inside a module subfolder
  end
end

resources :documents
root to: 'documents#index'

应该这样做。

修改

这是问题的一半,另一半是this。它需要config.action_dispatch.tld_length = 0配置中的development.rb行。