我的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)进行路由。
我只是错过了一些简单的东西,或者在铁轨上做这样的事情要困难得多吗?
答案 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
如果您向我们提供有关请求的更多信息(参数等),我们将会提供更好的帮助!