如何在rails路由中动态切换子域和命名空间

时间:2016-12-26 04:38:35

标签: ruby-on-rails ruby

我想创建一个动态路由,比如这个

https://subdomain.mysite.me/admin
https://mysite.me/subdomain/admin

我可以为routes约束设置subdomain,或namespace,但我不知道如何使它们都可用。

1 个答案:

答案 0 :(得分:1)

您只需查看this

即可

我设置了我的rails应用程序,以使用Ryan Bates提供的这个令人敬畏的RailsCast教程之后的自定义子域。用户可以访问company.lvh.me:3000并查看其所有相关信息。现在,我想在自定义子域的前面添加一个admin子域(admin.company.lvh.me:3000)。

我的想法是,每个博客都有特定的管理员和特殊的控制器/视图。因此,如果将admin添加到公司子域的前面,则rails将通过app / controllers / admin / blogs_controller.rb进行路由并显示app / views / admin / blogs / show.html.erb。

我已经使用了admin命名空间并将其设置为我之前的一些Rails应用程序中的子域,但是当我在这里尝试时,我需要第二个子域是动态的:

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

因此,如果在子域约束中键入admin.company,它就像魅力一样,但如何使其动态化?我没有运气在路线文件中使它变得动态('admin。'+ Subdomain等),这引出了我的想法:我可以只使用Ryan Bates的子域类吗?

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

class Subdomain
  def self.matches?(request)
    request.subdomain.present? && request.subdomain != "www"
  end 
end

Relevant Routes
Prefix Verb  URI Pattern  Controller#action
 admin GET   /            admin/blogs#show