2015-01-16 20 views
5

सिनात्रा दस्तावेज़ कहते हैं कि पर्यावरण विकास होने पर development? सत्य वापस आ जाएगा, लेकिन मुझे यह त्रुटि मिली है कि विधि development? अपरिभाषित है।सिनात्रा विधि 'विकास?' अपरिभाषित

मैंने शॉर्टेंड को छोड़ने और ENV['RAKE_ENV'] चर स्वयं परीक्षण करने का प्रयास किया, लेकिन यह सिर्फ शून्य था।

यह त्रुटि मैं हो रही है:

undefined method `development?' for main:Object (NoMethodError) 

और इस कोड को उस त्रुटि गतिवान कर रहा है:

require 'dm-sqlite-adapter' if development? 

मैं मॉड्यूलर शैली एप्लिकेशन का उपयोग कर रहा। उपरोक्त रेखा एक अलग फ़ाइल है जो केवल मॉडल का प्रबंधन करती है। क्या चल रहा है?

+1

क्या होता है यदि आप इसे प्रतीक के रूप में उपयोग करते हैं (कोलन चरित्र के साथ) "xyz" की आवश्यकता होती है यदि: विकास? –

+0

इसे फिक्स्ड। बहुत धन्यवाद। यदि आप इसे एक उत्तर के रूप में रखना चाहते हैं, तो मुझे इसे सही के रूप में स्वीकार करने में खुशी होगी। प्रतीक और गैर-प्रतीक वाक्यविन्यास के बीच क्या अंतर है? मुझे कैसे पता चलेगा कि किस का उपयोग करना है? –

+2

@EmanueleFeliziani जो एक फिक्स नहीं है ... यदि: any_symbol_whatever' हमेशा सत्य वापस आ जाएगा, क्योंकि प्रतीक 'शून्य' या 'झूठा' नहीं है। – matt

उत्तर

3

मैं भी इस के साथ संघर्ष कर रहा था। जिस तरह से मैंने खोज की है वह यहां है।

आप "अंदर" एक वर्ग है कि सिनात्रा :: बेस (जैसे सिनात्रा :: आवेदन, जो बेस से विरासत के रूप में) से विरासत development? विधि है, जो base.rb में परिभाषित किया गया है का उपयोग करने में सक्षम होना करने की आवश्यकता है।

क्लासिक सिनात्रा ऐप में आप पहले ही सिनात्रा :: बेस से विरासत में आने वाले वर्ग के अंदर "कोडिंग" कर रहे हैं। तो development? बस "कहीं भी" काम करेगा।

मॉड्यूलर सिनात्रा में development? केवल सिनात्रा में काम करेंगे :: जैसे बेस उप-वर्गों,:

require 'sinatra/base' 

# Placing 
# require 'dm-sqlite-adapter' if development? 
# here will not work. 

class ApplicationController < Sinatra::Base 
require 'dm-sqlite-adapter' if development? # But here it works 
... 
end 

# Placing 
# require 'dm-sqlite-adapter' if development?` 
# AFTER the above class will still not work 

class SomethingElse 
# nor will `development?` work here, since it is called inside 
# a class without Sinatra::Base inheritance 
... 
end 

तो बुनियादी तौर पर आप एक ApplicationController वर्ग कि सिनात्रा :: बेस से विरासत और अंदर यहाँ की जाँच का उपयोग कर सकते development? के लिए। एक ही उप-वर्गों है कि आपके ApplicationController वर्ग से विरासत के लिए चला जाता है:

class UserController < ApplicationController 
    require 'dotenv' if development? 
    ... 
end 

मॉड्यूलर सिनात्रा के लिए, में (मुख्य: ऑब्जेक्ट) कोड पाठ "बाहर" सिनात्रा :: बेस उप-वर्गों, आप Arup's पालन करने की आवश्यकता निर्देश:

if Sinatra::Base.environment == :development 
    require 'awesome_print' 
    require 'dotenv' 
    Dotenv.load 
    ... 
end 
3

आप मॉड्यूलर शैली का उपयोग कर रहे हैं, इसलिए आपको विधि से पहले मॉड्यूल नाम स्थान Sinatra::Base जोड़ने की जरूरत है।

तो आप ऐप में कहीं भी Sinatra::Base.development? तक पहुंच पाएंगे।

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