Rails中基于子域的资源

时间:2014-08-08 23:12:18

标签: ruby-on-rails routes subdomain

我正在寻找一种简单的方法来将xx.mydomain.com与mydomain.com/resources/xx匹配的所有路由替换为Rails 4。

是否有人有想法轻松地做到这一点,这也适用于嵌套资源?

谢谢,Joris

2 个答案:

答案 0 :(得分:1)

Constraints

您正在寻找的是您路线中的约束,特别是您希望使用一个确定您是否拥有可以访问的子域

如何实现这一目标有很多资源:

  

最重要的是,您可能需要创建自定义子程序约束,然后您可以使用标准路由结构:

#lib/subdomain.rb
class Subdomain
  def self.matches?(request)
    if request.subdomain.present? && request.subdomain != 'www'
        account = Account.find_by username: request.subdomain
        return true if account # -> if account is not found, return false (IE no route)
    end
  end
end


#config/routes.rb
constraints(Subdomain) do
   get "/", to: "controller#action"
   resources :posts #-> subdomain.domain.com/posts
   ...
end

以上是未经测试的 - 我还在Rails' documentation找到了以下内容:

#lib/subdomain.rb
class Subdomain
  def initialize
    @accounts = Account.all
  end

  def matches?(request)
    if request.subdomain.present? && request.subdomain != 'www'
        @accounts.include?(request.subdomain)
    end
  end
end

#config/routes.rb
constraints: Subdomain.new do
   get "/", to: "controller#action"
   resources :posts #-> subdomain.domain.com/posts
   ...
end

答案 1 :(得分:0)

以前我是如何在Rails 3应用程序中完成的:

  constraints :subdomain => /ambassador/ do
    namespace(:influencer, :path => '/') do
      root :to => 'home#index'
      match 'home' => 'sweepstakes#index', :as => :influencer_home
      resources :sweepstakes
      resources :associates
      resources :widgets
      resources :sessions
      resources :reports do
        resource :member
      end
      match 'faq' => 'info#faq'
    end
  end

请务必将此块放在 routes.rb 文件的顶部,以使其优先。

您当然可以像往常一样将资源嵌套在这里。