我正在构建一个具有merchant
子域的Rails应用。我有这两条路线:
get '/about', controller: :marketing, action: :about, as: :about
get '/about', controller: :merchant, action: :about, constraints: { subdomain: 'merchant' }, as: :merchant_about
但是当我使用他们的网址助手时,merchant_about_url
和about_url
会导致http://example.com/about
。
我知道我可以在帮助程序上指定subdomain
参数,以便在URL前加上子域名,但由于这些URL会在各种情况下经常使用,我想构建一个包装器这个助手让它变得更聪明。
我的问题:我可以检查一个给定的路线,看看它是否有子域约束吗?
如果可以的话,我想做以下事情:
def smart_url(route_name, opts={})
if # route_name has subdomain constraint
opts.merge!({ subdomain: 'merchant' })
end
send("#{route_name}_url", opts)
end
这样做,我可以有效地致电:
smart_url('about') # http://example.com/about
smart_url('merchant_about') # http://merchant.example.com/about
这可能吗?
答案 0 :(得分:0)
我可以检查给定路线以查看它是否有子域约束吗?
是的,这是可能的。您需要使用Rails的路由API来获取有关路由的信息。
def smart_url(route_name, opts={})
route = Rails.application.routes.routes.detect {|r| r.name == route_name }
if opts.is_a? Hash && route&.constraints[:subdomain]
opts.merge!({ subdomain: 'merchant' })
end
send("#{route_name}_url", opts)
end
上面按名称搜索路线,并在找到路线时检查其约束。
答案 1 :(得分:-1)
您可以在lib文件夹下创建类
class Subdomain
def self.matches?(request)
case request.subdomain
when SUB_DOMAIN_NAME
true
else
false
end
end
end
并在您的routes.rb文件中创建这样的路由
constraints(Subdomain) do
get '/about', to: 'marketings#about', as: :about
end
get '/about', to: 'marketings#about', as: :merchant_about