एकल अनुप्रयोग पर कई डोमेन को संभालने के लिए रेल मार्ग


90

मैं इस समस्या का समाधान करने में असमर्थ रहा हूँ, यहाँ और इसी तरह के कई सवालों के बावजूद। ऐसा लगता है कि इस प्रश्न का उत्तर रेल 3 के लिए नहीं दिया गया है, इसलिए यहाँ यह है:

मेरे पास एक ऐसा एप्लिकेशन है जो वर्तमान में उपयोगकर्ताओं को अपना उपडोमेन बनाने की अनुमति देता है जिसमें एप्लिकेशन का अपना उदाहरण होता है। रेल 2 में रहते हुए आपको सबडोमेन-फू मणि का उपयोग करके सर्व किया गया था, संस्करण 3 में यह नाटकीय रूप से सरल है, जैसे कि रेलसेकस - http://railscasts.com/episodes/221-subdomains-in-rails-3

यह अच्छी सामग्री है, लेकिन मैं उपयोगकर्ताओं को अपने डोमेन नाम को अपने खाते के साथ जोड़ने का विकल्प भी प्रदान करना चाहता हूं। इसलिए जब उनके पास http://userx.mydomain.com हो सकता है , तो मैं उन्हें http://userx.com चुनना पसंद करूंगा के रूप में अच्छी तरह से जुड़ा हुआ ।

मुझे रेल 2 में ऐसा करने के लिए कुछ संदर्भ मिले, लेकिन वे तकनीक अब काम नहीं करती हैं (विशेषकर यह एक: https://feefighters.com/blog/hosting-multiple-domains-from-a-single-rails -एप्प / )।

किसी को भी एक मनमाना डोमेन स्वीकार करने के लिए मार्गों का उपयोग करने के लिए एक तरीका सुझा सकता है और एक नियंत्रक के साथ इसे पारित कर सकता है ताकि मैं उपयुक्त सामग्री दिखा सकूं?

अपडेट करें : मुझे अब ज्यादातर जवाब मिल गया है, लियोनिद की समय पर प्रतिक्रिया के लिए धन्यवाद, और कोड पर एक नया रूप। यह अंततः मौजूदा उपडोमेन कोड के अतिरिक्त की आवश्यकता थी जो मैं (Railscast समाधान से) उपयोग कर रहा था और फिर मार्गों में थोड़ा जोड़ रहा था ।rb। मैं अभी तक वहां नहीं हूं, लेकिन मैं अब तक जो भी चाहता हूं, पोस्ट करना चाहता हूं।

Lib / subdomain.rb में:

class Subdomain
  def self.matches?(request)
    request.subdomain.present? && request.subdomain != "www"
  end
end

class Domain
  def self.matches?(request)
    request.domain.present? && request.domain != "mydomain.com"
  end
end

मैंने पहली की नकल में दूसरी कक्षा जोड़ी है, जिसे काम करने के लिए जाना जाता है। मैं बस एक शर्त जोड़ता हूं जो यह सुनिश्चित करता है कि आने वाला डोमेन वह नहीं है जिसके लिए मैं मुख्य साइट होस्ट कर रहा हूं।

इस वर्ग का उपयोग मार्गों में किया जाता है।

require 'subdomain'
constraints(Domain) do
  match '/' => 'blogs#show'
end

constraints(Subdomain) do
  match '/' => 'blogs#show'
end

यहाँ, मैं डोमेन के लिए जाँच करने के लिए एक श्लोक के साथ मौजूदा उपडोमेन कोड (फिर से, यह ठीक काम कर रहा हूँ) को प्रस्तुत कर रहा हूँ। यदि यह सर्वर उस डोमेन पर प्रतिक्रिया करता है और यह वह नहीं है जिसके तहत मुख्य साइट संचालित होती है, तो निर्दिष्ट नियंत्रक के आगे।

और जब यह काम करता हुआ प्रतीत होता है, तो मेरे पास अभी पूरी तरह से काम नहीं है, लेकिन मुझे लगता है कि यह विशेष समस्या हल हो गई है।


1
आपके संपादन के लिए बहुत बहुत धन्यवाद, हारून। मैं अभी ठीक उसी स्थिति से निपट रहा हूं। अनुवर्ती प्रश्न के रूप में, आप अपने सर्वर को किसी भी डोमेन को स्वीकार करने के लिए कैसे प्राप्त करते हैं जो इसे आगे भेजा जा रहा है? मुझे लगता है कि यह .conf फ़ाइल में एक सेटिंग होगा, लेकिन मुझे यकीन नहीं है कि क्या। किसी भी सहायता की सराहना की जाएगी!
घातक

हारून, मैं तुम्हारे साथ हूँ। मैं वही काम करना चाहता हूं। लेकिन मैं डोमेन को हार्डकोड नहीं करना चाहता। मुझे लगता है कि यह सब प्रोग्राम के बिना क्षेत्र फ़ाइलों और वेब सर्वर पुनरारंभ के बिना किया जाता है।
माइकल के मेडिसन

1
माइकल, आपको समस्या को इधर-उधर करने की जरूरत है। स्पष्ट रूप से उन मार्गों को घोषित और हार्डकोड करें जो विशेष रूप से आपके एप्लिकेशन (जैसे साइन-अप) के लिए होस्ट या सबडोमेन बाधा के साथ हैं, फिर अपने मुख्य मार्गों को "किसी भी डोमेन या उप डोमेन" के रूप में मानें। यह आपके नियंत्रकों की जिम्मेदारी है कि वे वर्तमान डोमेन या उपडोमेन को देखें और इसे सही ग्राहक को मैप करें।
जस्टिन फ्रेंच

जवाबों:


95

यह वास्तव में रेल 3 में आसान है, के अनुसार http://guides.rubyonrails.org/routing.html#advanced-constraints :

1) एक कस्टम बाधा वर्ग को परिभाषित करें lib/domain_constraint.rb:

class DomainConstraint
  def initialize(domain)
    @domains = [domain].flatten
  end

  def matches?(request)
    @domains.include? request.domain
  end
end

2) नए ब्लॉक सिंटैक्स के साथ अपने मार्गों में कक्षा का उपयोग करें

constraints DomainConstraint.new('mydomain.com') do
  root :to => 'mydomain#index'
end

root :to => 'main#index'

या पुराने जमाने का विकल्प वाक्य रचना

root :to => 'mydomain#index', :constraints => DomainConstraint.new('mydomain.com')

6
यह उत्तर मुझे बहुत सरल लगता है।
जारेड

7
यह एक बेहतरीन उपाय है। यह विकास के माहौल के साथ कैसे काम करता है?
१६:५२ पर सुपरलूमरी

2
यदि आप विकास के लिए स्थानीय डोमेन सेट करते हैं (उदाहरण के लिए, तो /etc/hosts) यह पूरी तरह से ठीक है ।
लियोनिद शेवत्सोव

7
नोट: यदि आप स्थानीय रूप से Pow का उपयोग करते हैं और mydomain.com.dev है, तो request.domain.com.dev लौटाता है। बदलें request.domainकरने के लिए request.hostऔर यह पूरी तरह काम करता है।
एरिक मुइसर

2
मैंने पाया है कि मुझे काम करने के लिए अनाम मार्ग बनाने हैं, अन्यथा मुझे Invalid route name, already in use: 'root'त्रुटि मिलती है ... ऐसा करने के लिए, मैंने मार्ग बदल दियाroot :to => 'mydomain#index', as: nil
बस लकी रियली

5

रेल 5 में, आप बस अपने मार्गों में ऐसा कर सकते हैं:

constraints subdomain: 'blogs' do
  match '/' => 'blogs#show'
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.