2012-08-30 17 views
5

देखने डिफ़ॉल्ट रूप से, रेल प्रारूप, फ़ाइल नाम में स्थान और टेम्पलेट भाषा के साथ विचारों पा सकते हैं (तो मैं बना सकते हैं index.de.json.erb)रेल में कस्टम वेरिएबल फ़ाइल नाम

यह एक और दृश्य के लिए कस्टम पैरामीटर जोड़ने के लिए, संभव है फ़ाइल का नाम?

मैं वर्तमान उप डोमेन पारित करने के लिए चाहते हैं, तो http://foo.example.com/index.foo.html.erb प्रस्तुत करना होगा, और http://bar.example.com/ (index.html.erb वापस आने के साथ उन दोनों) index.bar.html.erb प्रस्तुत करना होगा।

उत्तर

8

विचारों को देखने के लिए उपयोग किए जाने वाले हल करने वाले पैटर्न में केवल ActionView::LookupContext कक्षा के साथ पंजीकृत चर शामिल हो सकते हैं। इसलिए पहला कदम LookupContext कक्षा के साथ एक नया चर (subdomain) पंजीकृत करना है। आप एक प्रारंभकर्ता में करना चाहिए:

ActionView::LookupContext.register_detail(:subdomain) do 
    ['default_subdomain'] 
end 

अब LookupContextsubdomain बारे में जानता है, उसे ठीक करने के पैटर्न में शामिल किया जा सकता। हल करने पैटर्न बदलने के बारे में और अधिक विस्तार के लिए, यह भी एक प्रारंभकर्ता में ActionView::FileSystemResolver documentation देखते हैं, लेकिन अनिवार्य रूप से आप निम्नलिखित को शामिल करना चाहिए,:

ActionController::Base.view_paths = ActionView::FileSystemResolver.new(
    Rails.root.join('app', 'views'), 
    ':prefix/:action{.:locale,}{.:subdomain,}{.:formats,}{.:handlers,}' 
) 

यह पैटर्न अंततः Dir.glob को पारित कर दिया है (के बाद :* चर प्रतिस्थापित किया गया है)। ग्लोब पैटर्न {.:subdomain,} का अर्थ है "या तो .:subdomain या कुछ भी नहीं", जो उपडोमेन वाली फ़ाइल नहीं है, तो कोई सबडोमेन वाला दृश्य फ़ाइल में फ़ॉलबैक प्रदान करता है।

अंतिम चरण ApplicationController अद्यतन करने के लिए LookupContext को उपडोमेन पारित करने के लिए है:।

class ApplicationController < ActionController::Base 
    def details_for_lookup 
    {:subdomain => [request.subdomain]} 
    end 
end 

(इस उत्तर ज्यादातर स्रोत कोड को पढ़ कर पता लगा था, इन सुविधाओं में से कुछ दस्तावेज नहीं कर रहे हैं यह था रेल 3.2.5 के साथ परीक्षण किया गया)

+0

धन्यवाद! वह _exacly_ था जो मुझे चाहिए था। – user1105595

+0

खुशी है कि मैं मदद कर सकता हूं, और स्टैक ओवरफ़्लो में आपका स्वागत है। यदि कोई उत्तर आपकी समस्या हल करता है, तो आपको इसे स्वीकार करने के रूप में चिह्नित करना चाहिए, यहां और क्यों यहां पर अधिक जानकारी: http://meta.stackexchange.com/a/5235 – georgebrock

1

मुझे नहीं लगता कि आपको यहां एक कस्टम हैंडलर चाहिए। आप अपने टेम्पलेट्स के कुछ प्रीपेसिंग नहीं करते हैं, लेकिन आपको डोमेन टेम्पलेट बनने के लिए बस अपने टेम्पलेट की आवश्यकता है।

मैं कुछ इस तरह बनाने पर विचार होगा:

# in ApplicationController: 
    before_filter :set_view_paths 

    def set_view_paths 
    self.class.view_paths = Rails.root.join('app', 'views', controller_name, request.subdomain) 
    end 

तो फिर तुम प्रत्येक views/controller_name पथ के foo फ़ोल्डरों में foo डोमेन के लिए अपने टेम्पलेट पर रखना होगा।

डोमेन दृश्य की अनुपस्थिति के मामले में डिफ़ॉल्ट की अनुमति देने के लिए append/prepend_view_path documentation भी देखें।