检查给定路由以确定它是否具有子域约束

时间:2017-06-14 00:00:36

标签: ruby-on-rails routes rails-routing url-helper

我正在构建一个具有merchant子域的Rails应用。我有这两条路线:

get '/about', controller: :marketing, action: :about, as: :about
get '/about', controller: :merchant, action: :about, constraints: { subdomain: 'merchant' }, as: :merchant_about

但是当我使用他们的网址助手时,merchant_about_urlabout_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

这可能吗?

2 个答案:

答案 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