【问题标题】:Route Constraints Not Working As Expected路由约束未按预期工作
【发布时间】:2017-04-06 00:02:31
【问题描述】:

我希望路由约束能够让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 上的有效路由,因此单击该链接会导致该子域出现路由错误。如果 admin 子域约束块首先放在路由中,则 URL 帮助程序始终返回 /widgets/,从而断开非管理域上的链接。

否则路由可以工作,但不确定如何让 URL 帮助程序指向正确的。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

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

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

    您可能需要override the route helpers

    【讨论】:

    • 我没有更具体的解决方案,因为您尝试完成的工作可能无法实现,因为路由助手用于不支持请求的模型等上下文中。更好的解决方案可能是坚持使用单一规范的路由集。
    • 感谢您澄清路线助手不会在这里做我想做的事。我想出的最好的方法是给冲突的路由不同的名称,然后有自定义的 URL 助手,根据当前的子域返回正确的路由。这很有效,并且可能会达到预期效果。
    猜你喜欢
    • 1970-01-01
    • 2014-05-02
    • 2015-06-18
    • 2016-09-15
    • 1970-01-01
    • 2016-08-19
    • 2015-09-09
    • 1970-01-01
    相关资源
    最近更新 更多