2015-12-07 5 views
10

पर आधारित url_for का उपयोग करके बाधा आधारित यूआरएल प्राप्त करें क्या कोई तरीका है कि मैं url_for कार्रवाई प्रेषण रूटिंग के दौरान request.host पर आधारित url को वापस करने के लिए कर सकता हूं?घुड़सवार इंजन

mount Collaborate::Engine => '/apps/collaborate', :constraints => {:host => 'example.com' } 
mount Collaborate::Engine => '/apps/worktogether' 

उदाहरण:

जब उपयोगकर्ता example.com मेजबान पर है

collaborate_path =>// सहयोग

जब उपयोगकर्ता किसी अन्य मेजबान

पर है क्षुधा

सी ollaborate_path =>/apps/

worktogether अनुसंधान के एक बहुत बाद, मैं महसूस करते हैं कि RouteSet वर्ग named_routes जो यूआरएल वापस जाने के लिए बाधाओं पर विचार नहीं करता है।

मैं रेल आवेदन लेकिन सहारे काम से पिक करने के लिए action_dispatch/मार्ग/route_set.rb में @set अधिभावी अपेक्षा के अनुरूप

@search_set = Rails.application.routes.set.routes.select{|x| x.defaults[:host] == options[:host] }[0] 
@set = @search_set unless @search_set.blank? 

उत्तर

1

ठीक है की कोशिश की है, यहाँ अंधेरे में एक शॉट है, हो सकता है कि आपने इसे पहले से ही कोशिश की हो या शायद मैं वास्तव में कुछ खो रहा हूं। सतह पर, यह वास्तव में ऐसा लगता है कि आप apps के लिए पथ सहायक विधि को ओवरराइड करने का प्रयास कर रहे हैं। तो application_helper.rb में ओवरराइड क्यों सेट नहीं करें? कुछ ऐसा:

module ApplicationHelper 
    def collaborate_path 
    if request.domain == "example.com" 
     "/apps/collaborate" 
    else 
     "/apps/worktogether" 
    end 
    end 
end 
2

मेरी चिंता के रूप में यदि आप इसे मिडलवेयर स्तर पर संभालते हैं तो यह अच्छा होगा। यह मेरी धारणा है।

config/application.rb

config.middleware.insert_before ActionDispatch::ParamsParser, "SelectiveStack" 

में इस लाइन जोड़ें कन्वेंशन

app/middleware/selective_stack.rb

class SelectiveStack 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    debugger 
    if env["SERVER_NAME"] == "example.com" 
     "/apps/collaborate" 
    else 
     "/apps/worktogether" 
    end 
    end 


end 

आशा इससे आपकी समस्या का समाधान होगा के रूप में मिडलवेयर निर्देशिका के साथ अनुप्रयोग निर्देशिका में मिडलवेयर जोड़े । !!!

7

निकालें।अपने उदाहरण में कॉम

mount Collaborate::Engine => '/apps/collaborate', :constraints => {:host => 'examplesite' } 
mount Collaborate::Engine => '/apps/worktogether' 

सिर्फ

आप एक और अधिक उन्नत बाधा की जरूरत है, अपनी खुद की बाधा बनाने के काम करना चाहिए:

:

class CustomConstraint 
    def initialize 
    # Things you need for initialization 
    end 

    def matches?(request) 
    # Do your thing here with the request object 
    # http://guides.rubyonrails.org/action_controller_overview.html#the-request-object 
    request.host == "example" 
    end 
end 

Rails.application.routes.draw do 
    get 'foo', to: 'bar#baz', 
    constraints: CustomConstraint.new 
end 

तुम भी एक लैम्ब्डा के रूप में बाधाओं निर्दिष्ट कर सकते हैं

Rails.application.routes.draw do 
    get 'foo', to: 'foo#bar', 
    constraints: lambda { |request| request.remote_ip == '127.0.0.1' } 
end 

स्रोत: http://guides.rubyonrails.org/routing.html#advanced-constraints

+0

यह केवल तभी मदद करता है जब हमें सहयोगी_पैथ पर मार्ग पथ तक पहुंचाया जा सके, वास्तव में मेजबान को वास्तविक पथ को वापस करने के लिए बाधा में नहीं ले जाएगा। –

संबंधित मुद्दे