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

Aar*_*ron 16 subdomain routing routes ruby-on-rails rails-engines

建立

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

mount MySubApp::Engine => '/', as: :sub_app, constraints: {subdomain: 'sub_app'}
Run Code Online (Sandbox Code Playgroud)

问题

内路线MySubApproutes.rb文件,使用时命名拿到子域_url的帮手.例如以下内容apps/my_sub_app/config/routes.rb

MySubApp::Engine.routes.draw do
  resources :foos
end
Run Code Online (Sandbox Code Playgroud)

给我们,sub_app.foo_url(5)但结果

http:// www .example.com/foos/5

什么时候我们想要

http:// sub_app .example.com/foos/5

TL;博士

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

编辑:一个解决方法

虽然我仍然更喜欢更好的解决方案,但以下方法仍然可行.您可以将每个routes.rb可以安装在子域中的子应用程序文件中的所有路径包装起来,就像这样

MySubApp::Engine.routes.draw do
  constraints Rails.application.routes.named_routes[:sub_app].constraints do
    resources :foos
  end
end
Run Code Online (Sandbox Code Playgroud)

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

评论者(自删除?)指出您可以将subdomain选项传递给帮助者,但我们希望避免使用sub_app.foo_url(5, {subdomain: 'sub_app'})每个跨子域链接.即使我们将子域名移动到ENV var并创建了一个包装器,这也不是DRY.

bob*_*sol 1

查看指南,它说你可以这样做

namespace :Engine do
  resources :controller, :methods
end
Run Code Online (Sandbox Code Playgroud)

引擎只是你的代码的名称间隔