什么时候会在命名空间上使用子域?即http://admin.foo.com VS http://foo.com/admin
或者,我也喜欢 api.foo.com 与 foo.com/api 的外观。我还发现,子域的设置有点棘手。
最佳答案
在文件夹或子域中安装另一个应用程序对于 Web 服务器来说没什么大不了的,但是如果您的 Rails 应用程序同时包含/admin 和普通应用程序,那么将其中一个应用程序用作子域就会变得更加棘手。
值得庆幸的是,Rails 路由器在这方面非常灵活,并且很好地支持这两种场景。
TLDR:Rails 通过路由引擎支持两种方式,此时它取决于个人喜好(尽管我怀疑子域选项与路径助手的配合不太好)
/admin 路由
为了实现 /admin
路由,Rails 在路由中支持命名空间的概念。因此,在 Rails 应用程序中有一个/admin 区域,您只需在 routes.rb
中编写如下内容:
namespace :admin do
resources :users
resources :posts
end
然后将/admin 区域的 Controller 放入controllers/admin/.rb 中,并且该类必须以 Admin 为前缀(如 Admin::PostsController
)。
由于大多数应用程序的管理区域很可能会与普通应用程序中的模型进行交互,因此可以肯定地说,命名空间是最方便的方法。
子域路由
但事实证明,命名空间也可以与子域一起使用:
Rails 路由器可以定义constraint
block 并定义这些 block 内的命名空间。
因此,如果您只想在 admin.example.com 子域中托管上面的命名空间,您可以执行以下操作:
constraints(:subdomain => /admin/) do
namespace :admin do
resources :users
resources :posts
end
end
(我不知道约束功能,但 this blog post 似乎解释得很好)
这显然需要您配置 Web 服务器,使其为同一 Rails 应用程序提供 admin.example.com 和 www.example.com 服务。
我不确定 session (通过 cookie 实现)是否会延续,但我想您可以弄清楚这一点。
关于ruby-on-rails - admin 应该是子域还是命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14134643/