【发布时间】:2011-12-08 00:33:43
【问题描述】:
我需要路由以适用于托管和白标版本的 rails 应用程序。两个版本都在相同的代码库和相同的服务器上运行,因此路由需要弄清楚,但我不清楚如何实现这一点。
我正在建立一个工作委员会。每个注册的公司都可以在网站上创建自己的公司资料。如果他们获得付费的高级版本,他们可以使用他们自己的 CNAME 的 URL 并从他们的子域之一提供工作板。都是很标准的东西。
哪些路线需要在主站点上显示
http://jobsrus.com/companies/company-name
# e.g.
http://jobsrus.com/companies/microsoft
这会导致诸如
之类的路线http://jobsrus.com/companies/microsoft/jobs/
http://jobsrus.com/companies/microsoft/newest
什么路线需要在白标网站上显示
公司还可以为工作板贴上白标签,使其看起来像这样:
http://jobs.microsoft.com/jobs
http://jobs.microsoft.com/newest
澄清差异
澄清一下,相同的controller#action 将由双方提供:
http://company-domain/jobs
# and
http://jobsrus.com/companies/company-name/jobs
丑陋的路由:
最简单的路由是:
routes.rb
resources :companies do
...
resources :jobs do
...
end
end
给出:
http://jobsrus.com/companies/microsoft/jobs
# but also
http://jobs.microsoft.com/companies/microsoft/jobs
而我们希望后者是:
http://jobs.microsoft.com/jobs
如何从路由中删除第一层嵌套?
我的问题很简单。如何从路由中删除 companies/company-name 嵌套级别?白标站点唯一需要的路由是:
routes.rb
resources :jobs do
...
end
如何在路由中动态包含或排除嵌套级别?我可以使用request.host 变量来触发开关,但我不知道如何最好地激活或取消激活该嵌套层。
----- 编辑(和部分解决方案)-----------
使用@m_x 的答案,我使用约束来创建路由。为了更好地说明问题,我还使用了一些额外的路线:
(简化为仅显示 :show 和 :index 方法)
def company_resources
resources :jobs, only: [:index, :show] do
resource :applicants, only: [:index, :show] do
resource :messages, only: [:index, :show]
end
end
end
constraints host: /^(?!jobsrus\.com)/ do
company_resources
end
resources :companies, only: [:index, :show] do
company_resources
end
这在匹配传入请求方面效果很好,我们可以看到rake routes 产生了我们正在寻找的匹配项:
job_applicants_messages GET /jobs/:job_id/applicants/messages(.:format) {:host=>/^(?!jobsrus\.com)/, :action=>"show", :controller=>"messages"}
job_applicants GET /jobs/:job_id/applicants(.:format) {:host=>/^(?!jobsrus\.com)/, :action=>"show", :controller=>"applicants"}
jobs GET /jobs(.:format) {:host=>/^(?!jobsrus\.com)/, :action=>"index", :controller=>"jobs"}
job GET /jobs/:id(.:format) {:host=>/^(?!jobsrus\.com)/, :action=>"show", :controller=>"jobs"}
company_job_applicants_messages GET /companies/:company_id/jobs/:job_id/applicants/messages(.:format) {:action=>"show", :controller=>"messages"}
company_job_applicants GET /companies/:company_id/jobs/:job_id/applicants(.:format) {:action=>"show", :controller=>"applicants"}
company_jobs GET /companies/:company_id/jobs(.:format) {:action=>"index", :controller=>"jobs"}
company_job GET /companies/:company_id/jobs/:id(.:format) {:action=>"show", :controller=>"jobs"}
companies GET /companies(.:format) {:action=>"index", :controller=>"companies"}
company GET /companies/:id(.:format) {:action=>"show", :controller=>"companies"}
但是,现在不再有任何规范的方法来生成路由。如果我们想为特定公司的工作索引创建路线,我们必须使用不同的方法,具体取决于我们是在白标公司还是jobsrus.com 公司:
# path generator for jobs page on a whitelabel company
jobs_path
# => 'microsoft.com/jobs'
# path generator for jobs page on a company on the main site
company_jobs_path @company
# => 'jobsrus.com/companies/microsoft/jobs'
# what is actually required
company_jobs_path @company
# => 'jobsrus.com/companies/microsoft/jobs' (when on main site)
# => 'microsoft.com/jobs' (when on whitelabel)
我可以覆盖路径方法并定义一些根据host 变量切换的方法。不过,如果rails way 这样做会很好。支持吗?
【问题讨论】:
标签: ruby-on-rails routing