Rails 域约束(为多个域提供服务)

Jus*_*tin 4 nginx ruby-on-rails-4

$ rails -v Rails 4.2.1

$ ruby​​ -v ruby​​ 2.2.2p95 (2015-04-13 修订版 > 50295) [x86_64-linux]

我正在为一个移动应用程序构建一个 API,它将有一个管理界面。我正在尝试做的是使用 unicorn 通过 nginx 运行它(我在我的开发环境中运行)

我有 2 个域路由到完全相同的 Rails 项目。这些域是:api.project.devadmin.api.project.dev

我读过这个:http : //guides.rubyonrails.org/routing.html#advanced-constraints

并尝试过: Rails 4 中命名空间路由的单独域(请参阅答案)

我尝试了其他一些方法来尝试使其正常工作,唯一出现的问题(对于任一子域)是:

Invalid route name, already in use: 'root'

我目前的实现是:

class DomainConstraint
  def initialize(domain)
    @domains = domain
  end

  def matches?(request)
    @domains.include? request.domain
  end
end
Run Code Online (Sandbox Code Playgroud)

require 'domain_constraint'
Rails.application.routes.draw do
  resources :statuses
  constraints (DomainConstraint.new('api.project.dev')) do
    root :to => 'statuses#index'
  end

  constraints(DomainConstraint.new('admin.api.project.dev')) do
    root :to => 'statuses#new'
  end
end
Run Code Online (Sandbox Code Playgroud)

请记住,根现在只是不同的页面,但最终将是完全不同的系统。

不太确定从这里去哪里才能像我希望的那样发挥作用。

Jus*_*tin 6

在伟大人物的良好帮助下#RubyOnRailsirc我弄明白了这一点。所以感谢crankharder,并sevenseacat为您的意见和建议。

我最终得到的是这样的:

class DomainConstraint
  def initialize(domain)
    @domains = domain
  end

  def matches?(request)
    @domains.include? request.host
  end
end
Run Code Online (Sandbox Code Playgroud)

和:

require 'domain_constraint'
Rails.application.routes.draw do

  constraints DomainConstraint.new('api.project.dev') do
    resources :statuses
    root :to => 'statuses#index', as: 'api_root'
  end

  constraints DomainConstraint.new('admin.api.project.dev') do
    resources :statuses
    root :to => 'statuses#new'
  end
end
Run Code Online (Sandbox Code Playgroud)


Eli*_*kes 5

Request您还可以根据返回 的对象上的任何方法来约束路由Stringhttp://guides.rubyonrails.org/routing.html#request-based-constraints

可用的方法Request包括,host可以按如下方式使用:

  constraints host: 'api.project.dev' do
    resources :statuses
    root to: 'statuses#index', as: 'api_root'
  end

  constraints host: 'admin.api.project.dev' do
    resources :statuses
    root to: 'statuses#new'
  end
Run Code Online (Sandbox Code Playgroud)