2017-06-14 59 views
1

我正在構建具有merchant子域的Rails應用程序。我有這兩條路線:檢查給定路線以確定它是否具有子域限制

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

但是當我用自己的URL傭工都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 

這可能嗎?

回答

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 

上面根據名稱搜索路線,並在找到路線時檢查其約束條件。

+0

這是完美的!非常感謝你:)如果你有一分鐘​​的時間,我會遇到一個問題,opts可以是AR模型而不是散列。例如'user_url(@user)'('smart_url('user',@user)')。我無法追加'subdomain'參數。有什麼想法嗎? –

+1

@JodyHeavener - 請檢查我更新的答案。您可以手動對這種情況進行類型檢查。 – 31piy

-1

你可以這樣

class Subdomain 
    def self.matches?(request) 
     case request.subdomain 
     when SUB_DOMAIN_NAME 
      true 
     else 
      false 
     end 
    end 
end 

創建lib文件夾下的類,並在您的routes.rb文件創建這樣

constraints(Subdomain) do 
    get '/about', to: 'marketings#about', as: :about 
end 

get '/about', to: 'marketings#about', as: :merchant_about 
相關問題