2013-06-03 6 views
1

Je dispose d'un fichier YAML books.yaml:Comment rechercher un fichier YAML?

- !ruby.object:Book 
    title: Ruby for Newbz 
    author: LeeRoy Jenkins 
    category: Educational 

J'ai déjà une méthode qui ajoute des livres à ce dossier, mais je besoin d'une méthode qui permet de rechercher le fichier YAML en utilisant une expression régulière. Si aucun livre ne correspond au titre, il devrait déclencher une exception NoBookfound. S'il existe des correspondances, cette liste doit être renvoyée à l'appelant.

Voici mon code existant:

require 'yaml' 
require './book' 
class Library 
    attr_accessor :books 

    def initialize file_name = false 
    @books = file_name ? YAML::load(File.read(file_name)) : [] 

    end 

    def add_book(book) 
    @books.push(book) 

    end 

    def search_library(file_name , book) 
    if 
     YAML::load(File.read(file_name)).include?(book) == false 
     raise 'No Book Found' 
    end 
    end 

end 

C'est quelque chose que j'ai essayé pour la partie d'exception, mais je sens que je suis loin. Je suis vraiment nouveau à Ruby et cela semble être une tâche assez difficile. Quelqu'un a-t-il une idée?

Répondre

0

Qu'est-ce que vous avez besoin est de tester la classe de l'objet chargé:

book = YAML::load(File.read(file_name)) 
raise 'No Book Found' unless book.kind_of? Book 

Il y a aussi quelques kind_of? alternatives, que vous pouvez lire sur les différences sur ce Sur la base de votre poste nice question

0

, Je suppose que ce paramètre book est un objet Regexp. Je pense que vous devriez supprimer le paramètre nom_fichier de la méthode de recherche, car le fichier est déjà chargé sur la méthode initialize.

Mon serait Implémentation:

def search_library term 
    @books.find_all {|b| b.title =~ term} 
end 
+0

En fait, 'file_name' se réfère au fichier YAML et il y a une classe séparée du livre initialisant juste les trois descripteurs' '@ title' @ author' et' @ category' –

+0

Oui, je l'ai, mais Je pense que c'est un peu déroutant si vous chargez le fichier deux fois. Non, pour ne pas mentionner que vous allez perdre tous les objets de la méthode add_book. Si vous voulez garder le nom de fichier, je pense que ce serait mieux si vous faites de cette méthode statique: def self.search_library (nom de fichier, terme) ... –

+0

Je vois ce que vous dites, mon instructeur l'a également souligné. Merci pour l'aide! –

0

Puisque vous avez déjà « @books » dans un dénombrable vous pouvez utiliser le select method pour trouver des livres dont le titre ont le terme de recherche comme une sous-chaîne.

def search_library(term) 
    matches = @books.select { |x| x.title.index(term) } 
    raise "No books have title like '#{term}'" if matches.empty? 
    matches 
end 
+0

cela semble bien fonctionner, merci et à tous ceux qui ont répondu pour vos commentaires! –

+0

@HubertWolski: n'hésitez pas à modifier les réponses que vous pensiez utiles et choisissez-en une comme réponse «correcte» (ou meilleure, ou votre préférée). – maerics

+0

ne peut pas jusqu'à ce que j'ai un meilleur représentant sinon je le ferais :) –

Questions connexes