Rails:将子域路由到资源

是否可以将子域映射到资源? 我有一个公司模特。 目前,使用subdomain_fu,我的路由文件包含:

map.company_root '', :controller => 'companies', :action => 'show', :conditions => { :subdomain => /.+/ } 

我的公司模型包含“子域”列。

虽然这是按预期工作的,但它是一条命名路线,并不安宁。 基本上,我需要将“name.domain.com”映射到公司控制器的show动作。 命名路由是可行的,还是可以使用资源路由?

我不知道用map.resources做这个的map.resources 。 它接受a :conditions选项但我不确定如何删除URL的/companies/部分。 但是, map.resources主要是生成一组命名路由的便捷方式,您可以手动执行。 像这样的东西。

 map.company '', :controller => 'companies', :action => 'show', :conditions => { :subdomain => /.+/, :method => :get } map.new_company 'new', :controller => 'companies', :action => 'new', :conditions => { :subdomain => /.+/, :method => :get } map.edit_company 'edit', :controller => 'companies', :action => 'edit', :conditions => { :subdomain => /.+/, :method => :get } map.connect '', :controller => 'companies', :action => 'create', :conditions => { :subdomain => /.+/, :method => :post } map.connect '', :controller => 'companies', :action => 'update', :conditions => { :subdomain => /.+/, :method => :put } map.connect '', :controller => 'companies', :action => 'destroy', :conditions => { :subdomain => /.+/, :method => :delete } 

未经测试,但它应该让你接近。

可以将条件传递给资源路由以及命名路由。 在我参与的应用程序中,所有内容都限定在一个帐户中。 答:before_filter使用子域加载帐户。 因此,对于作用于帐户的资源,我们希望将路由范围限定为具有子域的URL。 干这样做的方法是使用带有选项的地图:

  map.with_options :conditions => {:subdomain => /.+/} do |site| site.resources :user_sessions, :only => [:new, :create, :destroy] site.resources :users site.login 'login', :controller => "user_sessions", :action => "new" site.logout 'logout', :controller => "user_sessions", :action => "destroy" … end map.connect 'accounts/new/:plan', :controller => "accounts", :action => "new" map.resources :accounts, :only => [:new, :create] 

正如您所看到的,命名路由也将接受带子域的条件哈希。 您也可以采用上面说明的Ryan方法,或者您可以基于每个资源指定条件:

  map.resources :users, :conditions => {:subdomain => /.+/} 

这是带有身份validation的Rails 3子域的完整示例实现(以及详细的教程)。 在Rails 3中比在Rails 2中更容易(不需要插件)。

使用Daniel的答案链接的资源,在Rails 3中 ,根据子域将’/’路由到不同的控制器的方法如下:

 match '/' => 'somecontroller#action', :constraints => { :subdomain => 'yoursubdomain' }