2010-06-07 6 views
3

J'ai du mal à désérialiser une classe ruby ​​que j'ai écrite à YAML.Classe personnalisée Ruby vers et depuis YAML;

Là où je veux être

Je veux être en mesure de passer un objet autour comme une pleine « question » qui comprend le texte de la question, quelques réponses possibles (Pour le choix multiple.) Et la bonne réponse . Un module (l'encodeur) prend une entrée, construit une classe 'question' et l'ajoute au pool de questions. Un autre module lit un pool de questions et construit un tableau d'objets 'question'.

Là où je suis actuellement

échantillon Question Piscine

--- | 
--- !ruby/object:MultiQ 
a: "no" 
answer: "no" 
b: "no" 
c: "no" 
d: "no" 
text: "yes?" 

dump Encoder fichier YAML. L'objet est un MultiQ rempli d'entrée. (Voir ci-dessous.)

def dump(file, object) 
    File.open(file, 'a') do |out| 
    YAML.dump(object.to_yaml, out) 
    end 
    object = nil 
end 

MultiQ Classe définition

class MultiQ 
    attr_accessor :text, :answer, :a, :b, :c, :d 

    def initialize(text, answer, a, b, c, d) 
    @text = text 
    @answer = answer 
    @a = a 
    @b = b 
    @c = c 
    @d = d 
    end 
end 

Le décodeur (je l'ai essayé différentes choses, donc ce qui est ici n'a pas été ma première ou meilleure estimation. Mais je suis à une perte et la documentation ne pas vraiment expliquer les choses assez bien.)

File.open("test_set.yaml") do |yf| 
    YAML.load_documents(yf) { |item| 
     new = YAML.object_maker(MultiQ, item) 
     puts new 
    } 
    end 

les questions que vous pouvez répondre

  1. Comment atteindre mon objectif? Quelles méthodes dois-je utiliser, entre l'analyse, le chargement de fichiers ou de documents, pour désérialiser avec succès une classe Ruby? J'ai déjà regardé le Yocl Rdoc, et je n'ai pas beaucoup absorbé, alors s'il vous plait, ne me liez pas.
  2. Quelles autres méthodes suggéreriez-vous d'utiliser? Y a-t-il une meilleure façon de stocker des questions comme celle-ci? Devrais-je utiliser le document db, relationnel db, xml? Un autre format?

Répondre

3

Lorsque vous écrivez à YAML, vous ne devez d'abord to_yaml d'appel, juste passer l'objet lui-même à YAML.dump (objet)

Cela vous probablement conduit à d'autres problèmes, car la sortie de to_yaml était une chaîne .. et le YAML.dump a réellement écrit votre objet comme une chaîne dans le fichier (c'est pourquoi vous avez une ligne initiale "- |" Tout code chargeant ce fichier chargerait ces données sous la forme d'une chaîne

Chargez un seul objet comme celui-ci:

File.open('test_set.yaml', 'r') { |fh| mq_loaded = YAML.load(fh) } 

Le "nouveau" que vous utilisez est généralement déroutant car nouveau est un mot-clé.

Questions connexes