2016-04-01 6 views
7

निर्देशिका मैं एक फ़ाइल के लिए कुछ लिखना चाहते हैं।errno :: ENOENT (ऐसी कोई फ़ाइल या @ rb_sysopen

# where userid is any intger [sic] 
path = Rails.root + "public/system/users/#{user.id}/style/img.jpg" 
File.open(path, 'wb') do |file| 
    file.puts f.read 
end 

जब यह कोड निष्पादित होने पर, मैं इस त्रुटि हो रही है। मैं जानता हूँ कि इस फ़ोल्डर नहीं करता ' टी मौजूद हैं, लेकिन File.openw मोड के साथ अगर यह मौजूद नहीं है एक नई फ़ाइल बनाता है।

क्यों इस काम नहीं कर रहा है, तो यह मौजूद नहीं है?

उत्तर

12

File.open(..., 'w') फ़ाइल बनाता है। कोई भी वादा किया है कि यह एक निर्देशिका का निर्माण करेगा इसके लिए पेड़।

एक और बात, किसी को गूंगा स्ट्रिंग concatenation के बजाय, निर्देशिका पथ बनाने के लिए File#join का उपयोग करना चाहिए।

path = File.join Rails.root, 'public', 'system', 'users', user.id.to_s, 'style' 

FileUtils.mkdir_p(path) unless File.exist?(path) 
File.open(File.join(path, 'img.jpg'), 'wb') do |file| 
    file.puts f.read 
end 
+0

बस उत्सुक किया जा रहा है: यहां इसका कारण क्यों File.join यहाँ सलाह दी जाती है? यह प्लेटफॉर्म विशिष्ट विभाजक (उदाहरण के लिए, विंडोज़ पर '\ ') के साथ पथ घटकों में हमेशा जुड़ता है। जबकि ** ** ** मामले हैं, जहां हम यही चाहते हैं, हम आमतौर पर सभी प्लेटफॉर्म पर '/' के साथ चिपकने का प्रयास करते हैं, क्योंकि यह पोर्टेबिलिटी के संबंध में कम सिरदर्द देता है। यहां पोस्ट किए गए कोड के मामले में, मुझे नहीं लगता कि प्लेटफ़ॉर्म-विशिष्ट फ़ाइल विभाजक क्यों लाभ उठा सकते हैं। – user1934428

+1

@ user1934428 "हम आम तौर पर सभी प्लेटफॉर्म पर चिपकने का प्रयास करते हैं, क्योंकि यह पोर्टेबिलिटी के संबंध में कम सिरदर्द देता है" - इसके अलावा 'फाइल.जॉइन' का उपयोग करके बकवास है, ओपी में एक जैसे मूर्खतापूर्ण गलतियों से बचने में मदद करता है: ' Rails.root' स्लैश के साथ समाप्त नहीं होता है और '+' '/ railsrootpublic /' देता है (ऊपर स्लैश मिस नोट करें) – mudasobwa

+0

@ मुदासोबावा: मेरे रेल कंसोल में रेल .root + "bla/bla" गीव सही पथ :) – ashwintastic

14

रेक रेक के अंदर gets का उपयोग करने का प्रयास कर रहे हैं?

errno :: ENOENT: आपको यह त्रुटि संदेश दिखाई जा रही है ऐसा कोई फ़ाइल या निर्देशिका @ rb_sysopen

आप त्रुटि खोजने का प्रयास किया था, और इस पृष्ठ पर खत्म? यह उत्तर ओपी के लिए नहीं है, बल्कि आपके लिए है।

STDIN.gets का उपयोग करें। समस्या सुलझ गयी। ऐसा इसलिए है क्योंकि केवल gets का उपयोग $stdin.gets पर हल हो जाता है और रेक वैश्विक चर को ओवरराइड कर रहा है ताकि gets एक फ़ाइल हैंडल खोलने का प्रयास करे जो मौजूद नहीं है।

What's the difference between gets.chomp() vs. STDIN.gets.chomp()?

+0

के लिए किया था यह भी 'होट' के उपयोग पर लागू होता है एक Vagrantfile। – bschlueter

+3

आप भगवान के काम कर रहे हैं – user3062913

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

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