路线约束无法按预期工作

时间:2017-04-06 00:02:31

标签: ruby-on-rails ruby

我希望路由限制可以使admin.example.com/widgets/example.com/admin/widgets/实际上相同,URL帮助器admin_widgets_path根据当前子域指向正确的路径。但是,无论约束如何,路径助手似乎只指向一个或另一个。

我做错了吗?这是一个错误吗?有没有更好的方法来解决这个问题?

已发布带有问题示例的rails应用here,但相关详情如下。

我的config/routes.rb

class Subdomains
  # any domain that starts with 'admin.'
  def self.admin?
    -> (request) { request.host =~ /^admin\./ }
  end

  # any other domain
  def self.primary?
    -> (request) { !admin?.(request) }
  end
end

Rails.application.routes.draw do
  constraints(Subdomains.primary?) do
    namespace :admin do
      resources :widgets
    end
  end

  constraints(Subdomains.admin?) do
    scope module: "admin", as: :admin do
      resources :widgets
    end
  end

  root to: "admin/widgets#index"
end

我的app/views/admin/widgets/index.html.erb

<%= link_to "Widgets", admin_widgets_url %>

在此配置中,admin_widgets_url始终返回/admin/widgets/ admin.example.com,这不是/widgets/上的有效路由,因此点击该链接会导致该子域出现路由错误。如果admin子域约束块首先放在路由中,则URL帮助程序始终返回Shell("new_console", "{Bash::Git bash}", "", "%CD%"),从而打破非管理域上的链接。

这些路线不起作用,但不确定如何让URL助手指向正确的路径。

1 个答案:

答案 0 :(得分:1)

您的期望是错误的 - Rails在设置阶段读取整个路径定义。这也是在创建路径助手时。直到稍后匹配请求时才会实际评估约束。

Rails将其拆分为不同的阶段以允许分叉。

相反,您可能需要override the route helpers