自定义子域上的Rails命名空间管理员

我的rails应用程序设置为使用此RailsCast中描述的子域:

http://railscasts.com/episodes/221-subdomains-in-rails-3

现在,我想在我的博客子域的前面添加一个admin子域,如下所示:

admin.company.lvh.me:3000 

我试图在我的子域约束之外命名管理员:

 namespace :admin, path: '/', constraints: { subdomain: 'admin' } do constraints(Subdomain) do match '/', to: 'blogs#show', via: 'get' end end 

但是,不是通过我的app / controllers / admin / blogs_controller进行路由,而是尝试通过我的“普通用户”控制器(app / controllers / blogs_controller)进行路由。

我只是遗漏了一些简单的东西,或者在铁轨上做这样的事情要困难得多吗?

我能够解决这个问题,虽然它感觉有点hackish。 了解Rails将约束视为true或false ,我在初始子域约束检查中设置了另一个约束。 它将子域分成2并检查第一个子域以查看它是否等于“admin”。 如果为true,则路由到admin / controllers和admin / views(因为模块:“admin” ),如果不是,则路由到不在“admin”模块内的不太具体的路由。

起初我没有名称空间:admin ,我的路由助手不正确(管理员路由没有以“admin”为前缀,因为它们是重复的,因此没有设置较少的特定路由)。 一旦我添加了命名空间:admin和路径:“” (这也很重要,因为它从URI模式中删除了“admin /”),它有效!

最后一点,在admin / controllers中,你必须编辑set_blog方法,因为正在解释“admin.company”(参见admin / blogs_controller.rb)。

的routes.rb

 Blog::Application.routes.draw do constraints(Subdomain) do namespace :admin, module: "admin", path: "", constraints: lamda { |r| r.subdomain.split('.')[0] == 'admin' } do match '/', to: 'blogs#show', via: 'get' ... end match '/', to: 'blogs#show', via: 'get' ... end ... end 

耙路:

 Prefix Verb URI Pattern Controller#Action admin GET / admin/blogs#show ... 

GET /博客#show …

管理员/ blogs_controller.rb

 BlogController < ApplicationController before_action :set_blog ... private set_blog @blog = Blog.find_by_subdomain!(request.subdomain.split('.')[1]) end end 

让我知道是否有更清洁的东西,如果没有,希望这有助于其他人解决这个问题。

这里有几个重要因素

首先,您需要查看“多”子域的约束参数是什么样的。 Rails可以将admin.company作为子域,而不是拆分

如果我们认为Rails会将子域分成两个,哪一个被称为“父”?

 namespace :admin, path: '/', constraints: { subdomain: 'admin' } do constraints(Subdomain) do resources :blogs, only: :show, path_names: { show: "" } end end 

如果您向我们提供有关请求的更多信息(参数等),我们将更好地帮助您!