আমি রুবিতে কীভাবে YAML ফাইলটি পার্স করব?


210

আমি নীচের বিষয়বস্তুগুলির সাথে কোনও ওয়াইএএমএল ফাইলকে কীভাবে পার্স করতে হবে তা জানতে চাই:

--- 
javascripts: 
- fo_global:
  - lazyload-min
  - holla-min

বর্তমানে আমি এটি এভাবে পার্স করার চেষ্টা করছি:

@custom_asset_packages_yml = (File.exists?("#{RAILS_ROOT}/config/asset_packages.yml") ? YAML.load_file("#{RAILS_ROOT}/config/asset_packages.yml") : nil)
    if !@custom_asset_packages_yml.nil?
      @custom_asset_packages_yml['javascripts'].each{ |js|
        js['fo_global'].each{ |script|
         script
        }
      }
    end

তবে এটি কাজ করে বলে মনে হচ্ছে না এবং আমাকে একটি ত্রুটি দেয় যে মানটি শূন্য।

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

যদি আমি এটি চেষ্টা করি তবে এটি পুরো স্ট্রিংটি ফেলে দেয় (fo_globallazyload-minholla-min):

if !@custom_asset_packages_yml.nil?
          @custom_asset_packages_yml['javascripts'].each{ |js|
            js['fo_global']
          }
        end

1
স্ক্রিপ্টটি চালানোর সময় আপনি কি আউটপুট দিতে পারবেন? সঠিক জায়গায় ফাইল? আপনি সর্বদা একটি রেলস কনসোল জ্বালিয়ে দেখতে পারেন এবং রুবিও সেই পথটি দেখতে পারে কিনা তা দেখতে পারেন।
Lukas

হ্যাঁ, ফাইলটি বিদ্যমান এবং সঠিক অবস্থানে রয়েছে। Ive ত্রুটি সহ আমার পোস্ট আপডেট করেছেন।
alvincrespo

উত্তর:


449

সম্ভবত আমি কিছু মিস করছি, তবে কেন ফাইলটি বিশ্লেষণের চেষ্টা করবেন? কেন শুধু ওয়াইএএমএল লোড করবেন না এবং ফলাফলটি (গুলি) পরীক্ষা করবেন না?

যদি আপনার নমুনা ওয়াইএএমএল থাকে some.ymlতবে এটি:

require 'yaml'
thing = YAML.load_file('some.yml')
puts thing.inspect

আমাকে দেয়

{"javascripts"=>[{"fo_global"=>["lazyload-min", "holla-min"]}]}

9
আমি সম্মতি জানাই, ওয়াইএএমএল সম্পর্কে এটি দুর্দান্ত - আমরা কিছু ধারাবাহিক করতে পারি, পরে এটি আবার পড়তে পারি, তাই কেন সেই ক্ষমতাটি ব্যবহার করবেন না।
টিন ম্যান

আহ, আমি জানতাম না যে আপনি ওয়াইএএমএল ফাইল দিয়ে এটি করতে পারেন। অনেক ধন্যবাদ!
alvincrespo

1
হু, কারণ আমি ট্যাব ব্যবহার করছিলাম। দেখে মনে হচ্ছে এটি কেবল ট্যাবগুলির পরিবর্তে ফাঁকা স্থান চায় এবং তারপরে সমস্ত ধরণের ত্রুটি নিক্ষেপ করে।
ফিলবট 3

3
ওয়াইএএমএল লাইব্রেরিতে # লোড এবং # লোড_ফায়ালের মধ্যে পার্থক্য কী?
Jwan622

3
YAML.loadএকটি YAML স্ট্রিং YAML.load_fileনেয়, একটি আপেক্ষিক ফাইলের পথ নেয়।
নার্ফানিয়েটর

11

আমারও একই সমস্যা ছিল তবে ফাইলের সামগ্রী (ওয়াইএএমএল ফ্রন্ট-ম্যাটারের পরে) পেতেও চেয়েছিলাম।

এটি আমি খুঁজে পেয়েছি সেরা সমাধান:

if (md = contents.match(/^(?<metadata>---\s*\n.*?\n?)^(---\s*$\n?)/m))
  self.contents = md.post_match
  self.metadata = YAML.load(md[:metadata])
end

উত্স এবং আলোচনা: https://practisingruby.com/articles/tricks-for-working-with-text-and-files



ধন্যবাদ @ দেবস্টাফ - উত্তরে আমি লিঙ্কটি আপডেট করেছি।
সরফটা

3

Yml ফাইল (গুলি) এর সামগ্রী পরীক্ষা করার জন্য টার্মিনাল থেকে আমি যে এক লাইনার ব্যবহার করছি তা এখানে:

$ ruby  -r yaml -r pp  -e 'pp YAML.load_file("/Users/za/project/application.yml")'
{"logging"=>
  {"path"=>"/var/logs/",
   "file"=>"TacoCloud.log",
   "level"=>
    {"root"=>"WARN", "org"=>{"springframework"=>{"security"=>"DEBUG"}}}}}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.