我希望路由限制可以使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助手指向正确的路径。
答案 0 :(得分:1)
您的期望是错误的 - Rails在设置阶段读取整个路径定义。这也是在创建路径助手时。直到稍后匹配请求时才会实际评估约束。
Rails将其拆分为不同的阶段以允许分叉。
相反,您可能需要override the route helpers。