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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails:对相同控制器名称的子域约束相关的知识,希望对你有一定的参考价值。

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

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
答案

根据Rails Routing Guide

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

所以,我相信你的例子,你应该将约束路线移到非约束路线之上,这样他们就有机会先匹配,然后如果你不是,那么你将“回退”到非约束文件资源在子域名上。

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线。

以上是关于Rails:对相同控制器名称的子域约束的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails 将通配符子域路由到控制器/操作

ruby 使用控制数据库Rails多租户/多数据库和子域

在子域允许访问一个页面,如果试图访问其他页面重定向到主域名

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?

rails: 如何基于子域覆盖locale?

如何在rails的同一个表中创建多对多