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

时间:2014-04-27 04:37:33

标签: ruby-on-rails wildcard-subdomain

我的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)进行路由。

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

2 个答案:

答案 0 :(得分:1)

我能够解决这个问题,虽然它感觉有点hackish。了解Rails将约束视为真或假,我在初始子域约束检查中设置了另一个约束。它将子域分成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

Rake Routes:

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

GET / blogs #show      ...

管理员/ blogs_controller.rb

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

如果有更清洁的话,请告诉我,如果没有,希望这可以帮助其他人解决这个问题。

答案 1 :(得分:0)

这里有几个重要因素

首先,您需要了解约束参数的含义&#34; multi&#34;子域。 Rails可能有admin.company作为子域

,而不是拆分

如果我们认为Rails会将子域分成两个,哪一个被称为&#34;父&#34;?

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

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