安装在子域中的引擎中的路由不会继承约束

时间:2014-05-23 12:56:11

标签: ruby-on-rails routing routes subdomain rails-engines

设置

我们当前的Rails应用程序是由作为引擎安装的子应用程序构成的。通常,这些引擎安装在主routes.rb文件的子域中,如下所示

mount MySubApp::Engine => '/', as: :sub_app, constraints: {subdomain: 'sub_app'}

问题

MySubApp的{​​{1}}文件中的路由在使用指定的routes.rb帮助程序时获取子域名。例如_url

中的以下内容
apps/my_sub_app/config/routes.rb

给我们MySubApp::Engine.routes.draw do resources :foos end ,但结果是

  

的http:// WWW .example.com的/ FOOS / 5

我们想要的时候

  

的http:// sub_app .example.com的/ FOOS / 5

TL;博士

如何将引擎的安装约束传递给其命名路由?

编辑:解决方法

虽然我仍然更喜欢更好的解决方案,但以下方法仍然有效。您可以将每个子应用sub_app.foo_url(5)文件中的所有路径包装起来,这些文件可以安装在子域中,如此

routes.rb

编辑2:一个不太理想的解决方法

评论者(自删除后?)指出您可以向帮助者传递MySubApp::Engine.routes.draw do constraints Rails.application.routes.named_routes[:sub_app].constraints do resources :foos end end 选项,但我们希望避免对每个跨子域链接使用subdomain。即使我们将子域名移动到ENV var并创建了一个包装器,这也不是DRY。

2 个答案:

答案 0 :(得分:1)

@Aaron不确定你是否修复过这个问题,但请查看

config.action_dispatch.tld_length

设置(在引擎的配置上)。我不确定它会如何对引擎做出反应,但在我们的例子中它让我们处理我们的登台服务器的子子域的情况(所以当我们将_url助手与登台服务器一起使用时,它正确地做了subdomain.staging.domain.com,而不是subdomain.domain.com)。

答案 1 :(得分:0)

查看guide它说你可以通过

执行此操作
namespace :Engine do
  resources :controller, :methods
end

引擎只是名称间隔代码