2010-08-21 15 views
46

मुझे रेलवे 3 इंजन के भीतर से प्रोग्रामर एप्लिकेशन का नाम जानना होगा।मैं रेल 3 एप्लिकेशन ऑब्जेक्ट के नाम तक कैसे पहुंचूं?

+0

क्या आप एप्लिकेशन नाम पर जाना चाहते हैं जब आपने "आपके नए एप्लिकेशन को रेल" या केवल कक्षा का नाम बनाया था? – Tilo

उत्तर

15

रेल 3 में, जेनरेट किए गए एप्लिकेशन को एप्लिकेशन नाम से मेल खाने वाला मॉड्यूल नेमस्पेस दिया जाता है। तो यदि आपके आवेदन को "ट्विटर" कहा जाता है, तो Rails.application की श्रेणी "ट्विटर :: एप्लिकेशन" है।

इसका मतलब है आप अपने रेल आवेदन के वर्ग के नाम की स्ट्रिंग विभाजित इस तरह एक आवेदन नाम पाने के लिए कर सकता है कि:

Rails.application.class.to_s.split("::").first 

हमारे उदाहरण में, जिसके परिणामस्वरूप स्ट्रिंग "ट्विटर" होगा।

+1

क्या ऐसा कुछ ऐसा है जिसका उपयोग रेल 2.3 में किया जा सकता है? – nzifnab

+0

यह कक्षा का नाम है, न कि एप्लिकेशन का नाम चेक-इन – Tilo

+0

@ टिलो ट्रू, सिवाय इसके कि 97% मामलों के लिए, यह उन लोगों के लिए पर्याप्त है जो उनके ऐप को सावधानी से – Scott

5

Rails.application आपकी MyApp::Application कक्षा देता है।

1

स्कॉट उत्तर का उपयोग करना, मैं अपने app/controllers/application_controller.rb फ़ाइल

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    helper_method :app_name 
    private 
    def app_name 
     Rails.application.class.to_s.split("::").first 
    end 
तब मेरे टेम्पलेट्स में

मैं सिर्फ #{app_name} कर सकते हैं जहाँ भी यह आवश्यक है, अगर आप अपने नाम बदलने की आवश्यकता है जो यह बहुत एक परेशानी का कम करता है में निम्नलिखित डाल ऐप (जिसे मुझे आज सुबह करना था)।

107
Rails.application.class.parent_name 
+1

यह क्लास नाम है, और एप्लिकेशन का नाम चेक-इन – Tilo

+2

Rails.application.class.parent आपको मॉड्यूल स्थिर देता है, जिसे आप तब तक कॉल कर सकते हैं या नाम पर कॉल कर सकते हैं। – Docunext

19

मूल पोस्टर के लिए कहा रेल एप्लिकेशन का नाम, वर्ग के नाम के लिए नहीं। वे दो अलग-अलग चीजें हैं। जैसे रेल ऐप की वर्तनी रेल की अपेक्षाओं से भिन्न हो सकती है, उदाहरण के लिए 'test_app' के बजाय 'test-app'।

रेल्स ऐप के नाम को प्राप्त करना मुश्किल है जैसा कि चेक किया गया था- में, क्योंकि वह नाम संरक्षित नहीं है। सत्र_स्टोर के लिए केवल विकल्पों में मूल स्ट्रिंग को थोड़ा संशोधित करना प्रतीत होता है।

रेल एप्लिकेशन के नाम से प्राप्त करने के लिए सबसे अच्छा तरीका है:

यह भले ही अपने अनुप्रयोग निर्देशिका नाम दिया गया था, या प्रतीक से जुड़े काम करेंगे!

Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'') 
=> "test-app" 

क्यों? चूंकि ऐप के लेखक ने नाम रेल की तुलना में अलग-अलग वर्तनी की हो सकती है ... उदा। '_' के बजाय '-' अक्षरों के साथ; जैसे "टेस्ट एप्लिकेशन"। कक्षा के नाम से आप सही वर्तनी प्राप्त करने की गारंटी नहीं दे सकते।

इस जानकारी का उपयोग करके आप ऐसा कर सकता है:

class << Rails.application 
    def name 
    Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'') 
    end 
end 

Rails.application.name 
=> 'test-app' 

या बस अपने ./config/environment.rb से जोड़ें:

APP_VERSION = '1.0.0' 
APP_NAME = Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'') 

कि इन स्थिरांक एप्लिकेशन के शीर्ष-स्तर पर उपलब्ध कराता है।


बंद है, लेकिन कोई सिगार:

यह लगभग सही है, लेकिन यह अभी भी विफल हो जाएगा यदि अनुप्रयोग निर्देशिका का नाम बदला जाता है (उदाहरण के लिए तैनाती के दौरान करने के लिए ' "20121001_110512" या "नवीनतम" .. ।फिर निम्न टूट जाएगा:

File.basename(Rails.root.to_s) 
=> "test-app" 

निम्नलिखित दो दृष्टिकोण के साथ .. आप एक नाम केवल अनुमान लगा सकता है सही वर्तनी के लिए नहीं मिल सकता है:

इस उप इष्टतम है, और गलत तरीके से लिखे गए परिणाम दे सकते हैं:

आप इस तरह आवेदन नाम की एक व्युत्पन्न करने के लिए प्राप्त कर सकते हैं:

Rails.application.engine_name.gsub(/_application/,'') 
=> "test_app" 

लेकिन कृपया ध्यान दें कि यह मूर्ख-प्रमाण नहीं है, क्योंकि किसी ने ऐप "test-app" नाम दिया होगा और आप उपरोक्त परिणाम देखेंगे, न कि '-' के साथ सही नाम।

यही बात सच है अगर आप इसे इस तरह से निकाले जाते हैं है:

Rails.application.class.parent_name 
=> "TestApp" 

इस वर्ग के नाम है, लेकिन क्या आप वाकई नाम के लिए रास्ता लेखक इसकी वर्तनी पाने के लिए नहीं हो सकता।

+0

मुझे लगता है कि यह पिछले खंड में 'Rails.application.class.parent_name' होना चाहिए लेकिन मैं इसे संपादित नहीं कर सकता क्योंकि मेरा परिवर्तन 6 वर्णों से कम है। धन्यवाद StackOverflow। –

+0

इसे इंगित करने के लिए धन्यवाद! मैंने ठीक कर दिया। – Tilo

+0

यह सही है, रेल-वाई उत्तर। मैं यह भी ध्यान दूंगा कि अधिकांश उपयोगकर्ता इस पर उपयोग के लिए .humanize.titleize पर कॉल करना चाहते हैं। – Sam

0

आप config.ru फ़ाइल में इस पा सकते हैं:

run Dinosaur::Application 

या Rakefile में: करने के लिए

Dinosaur::Application.load_tasks 

नाम पहले "::" एप्लिकेशन नाम

3
है

अधिक "मानवकृत" संस्करण के लिए (पहले उत्तर के आधार पर आप यहां पा सकते हैं) निम्न विधि पर विचार करें: यह आपके TestApp एप्लिकेशन के लिए Test App वापस करेगा।

def app_name 
    Rails.application.class.parent_name 
    .underscore 
    .humanize 
    .split 
    .map(&:capitalize) 
    .join(' ') 
end 
संबंधित मुद्दे