2017-03-15 1 views
-1

J'ai un problème avec mon application dans Rails 5. Je crée la classe scrape.rb qui grattage HTML via Nokogiri gem et peut enregistrer ces données dans un autre modèle, mais quand je crée un nouvel objet dans la console rails ce néant retour et ne ferraille aucune valeur:Rails 5 modèle avec Nokogri gem retour nil

2.3.0 :018 > s = Scrape.new 
=> #<Scrape:0x007fba68b79e98> 
2.3.0 :019 > s.scrape_new_movie 
=> nil 
2.3.0 :020 > 

Voici scrape.rb modèle

class Scrape 
    attr_accessor :title, :vote, :image_url, :description, 

    def scrape_new_movie 
    begin 
     doc = Nokogiri::HTML(open("https://zalukaj.com/zalukaj-film/26280/barbie_w_wiecie_gier_barbie_video_game_hero_2017_.html").read, nil, 'utf-8') 
     doc.css('script').remove 
     self.title = doc.css('#pw_title.about_movie_title').text 
     v = doc.css('#success_vote').text 
     self.vote = v.slice(2...5) 
     self.image_url = doc.css('.about_movie img').attr('src').text 
     self.description = doc.css('#pw_description.e_s3k').text 
     return true 
     rescue Exception => e 
     self.failure = "Something went wrong with the scrape" 
    end 
    end 

    def save_movie 
    movie = Movie.new(
     title: self.title, 
     vote: self.vote, 
     image_url: self.image_url, 
     description: self.description 
    ) 
    movie.save 
    end 
end 
+0

Après avoir exécuté 's.scrape_new_movie', qu'est-ce que' s.failure' retour? – ReggieB

+0

Essayez d'enlever 'begin/rescue/end' et voyez quelles erreurs se produisent. – ReggieB

+0

Lorsque je l'ai supprimé, la valeur est toujours nulle. Comment je peux vérifier ce que 's.failure' retourne? –

Répondre

0

La raison pour laquelle il revient nil, est parce que vous terminez votre attr_accessor par une virgule. La variable failure est également indéfinie, donc je suppose que vous voulez un attr_accessor pour cela aussi.

Vous devez changer

attr_accessor :title, :vote, :image_url, :description, 

à

attr_accessor :title, :vote, :image_url, :description, :failure 
+0

Oui ça marche maintenant! Merci beaucoup pour l'invite. –

0

Remplacer la méthode:

def scrape_new_movie 
    begin 
     doc = Nokogiri::HTML(open("https://zalukaj.com/zalukaj-film/26280/barbie_w_wiecie_gier_barbie_video_game_hero_2017_.html").read, nil, 'utf-8') 
     doc.css('script').remove 
     self.title = doc.css('#pw_title.about_movie_title').text 
     v = doc.css('#success_vote').text 
     self.vote = v.slice(2...5) 
     self.image_url = doc.css('.about_movie img').attr('src').text 
     self.description = doc.css('#pw_description.e_s3k').text 
     return true 
     rescue Exception => e 
     self.failure = "Something went wrong with the scrape" 
    end 
    end 

Avec

def scrape_new_movie 
    doc = Nokogiri::HTML(open("https://zalukaj.com/zalukaj-film/26280/barbie_w_wiecie_gier_barbie_video_game_hero_2017_.html").read, nil, 'utf-8') 
    doc.css('script').remove 
    self.title = doc.css('#pw_title.about_movie_title').text 
    v = doc.css('#success_vote').text 
    self.vote = v.slice(2...5) 
    self.image_url = doc.css('.about_movie img').attr('src').text 
    self.description = doc.css('#pw_description.e_s3k').text 
    return true 
    end 

Ensuite, toute erreur qui se produit bouillonner et être affichés d'une manière qui vous permet de déboguer le problème est.

Ceci est un bon exemple de pourquoi vous ne devriez jamais faire rescue Exception car cela rend toujours plus difficile le débogage d'un problème. Voir: Why is it a bad style to `rescue Exception => e` in Ruby?

+0

Ok, mais quand j'ai remplacé une méthode comme vous, elle est toujours nulle et je n'ai aucune idée de comment je peux la déboguer. –

+0

Avez-vous d'autres clauses 'rescue' dans le code? – ReggieB

0

Avec la façon dont vous l'avez configuré, il n'est pas nécessaire d'appeler le nom littéral de la classe. Juste ajouter moi-même. aux méthodes et n'appellent pas nouveau. Il y a aussi un certain nombre de bogues dans ce script si vous voulez déboguer cela, je soulèverais aussi le message d'exception. Vous devriez aussi changer self.title = en @title = ou si vous voulez conserver self.title, vous devez ajouter la classe à hériter de self et mettre attr_accessor dans cette classe.

class Scrape 
    class << self 
    attr_accessor :title, :vote, :image_url, :description, failure 
    end 

    def self.scrape_new_movie 
    begin 
     doc = Nokogiri::HTML(open("https://zalukaj.com/zalukaj-film/26280/barbie_w_wiecie_gier_barbie_video_game_hero_2017_.html").read, nil, 'utf-8') 
     doc.css('script').remove 
     self.title = doc.css('#pw_title.about_movie_title').text 
     v = doc.css('#success_vote').text 
     self.vote = v.slice(2...5) 
     self.image_url = doc.css('.about_movie img').attr('src').text 
     self.description = doc.css('#pw_description.e_s3k').text 
     return true 
     rescue Exception => e 
     raise e 
     end 
    end 

    def self.save_movie 
     movie = Movie.new(
     title: self.title, 
     vote: self.vote, 
     image_url: self.image_url, 
     description: self.description 
    ) 
     movie.save 
    end 
end  
Scrape.scrape_new_movie