2017-02-25 11 views
0

J'essaie d'utiliser la gemme Wikipedia pour exécuter une tâche râteau et faire correspondre la première image .jpg, .png ou .gif à enregistrer dans mon instance d'institut. J'utilise Ruby Rails 2.3 et 5.Rechercher le premier dans le tableau

Mon code actuel est comme suit:

namespace :import do 
    desc "Import images from Wikipedia" 
    task institutes: :environment do 
    require 'wikipedia' 
    Institute.all.each do |institute| 
     school = institute.name 
     page = Wikipedia.find(school) 
     next if page.content.nil? 

     accepted_formats = [".jpg", ".png", ".gif"] 
     images = page.image_urls 
     image = images.find {|i| i.image_type } 

     institute.update!(image_url: image) 
    end 
    def image_type 
     accepted_formats = File.extname(i) 
    end 
    end 
end 

cela génère l'erreur NoMethodError: private method 'image_type' called for #<String....>

est-il un moyen plus efficace (et qui fonctionne!) de faire cela? Désolé, je n'ai pas l'expérience de Ruby! Je ne peux pas déterminer quelle est la meilleure façon de faire fonctionner cela; faut-il inclure une méthode ailleurs ou s'il y a une meilleure façon de le faire?

Répondre

0

Je vais vous recommander, au premier coup d'œil, il faut mettre à jour institute. Ensuite, si vous voulez utiliser accepted_formats, vous devez le définir dans constant comme: ACCEPTED_IMAGE_FORMATS ou l'envoyer comme argument. Ensuite, vous devez déplacer l'action qui devrait retourner l'image acceptée à la méthode, quelque chose comme first_valid_image(images, accepted_formats). À mon avis, cela devrait ressembler à:

namespace :import do 
    desc "Import images from Wikipedia" 
    task institutes: :environment do 
    require 'wikipedia' 
    Institute.all.each do |institute| 
     school = institute.name 
     page = Wikipedia.find(school) 
     next if page.content.nil? 

     accepted_formats = [".jpg", ".png", ".gif"] 
     images = page.image_urls 
     image = first_valid_image(images, accepted_formats) 

     institute.update!(image_url: image) if image # this action would run only if image.ni? == false 
    end 

    def first_valid_image(images, accepted_formats) 
     images.find do |image| 
     File.extname(image).in? accepted_formats 
     end 
    end 
    end 
end 
+0

Cela a fonctionné parfaitement. Merci! –