2017-02-25 14 views
0

私はrakeタスクを実行し、.jpg、.png、または.gifの最初のイメージと一致させてWikipedia gemを使用して、私のinstituteインスタンスに保存しようとしています。私は5最初に配列を検索

私の現在のコードは次の通りであるルビー2.3とRailsを使用しています:

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 

これはエラーNoMethodError: private method 'image_type' called for #<String....>

を与えて、より効率的な方法(と動作するものがあります! )これを行うの?申し訳ありませんが、私はRubyでそれほど経験はありません!私はこれを動作させる最良の方法が何であるかを考え出すことはできません。他の場所にメソッドを含めるか、それを行うためのよりよい方法があるかどうか

答えて

0

私はまず、instituteを更新する必要があることを確認することをお勧めします。次に、accepted_formatsを使用する場合は、ACCEPTED_IMAGE_FORMATSのようにconstantに定義するか、引数のように送信してください。 次に、受け入れたイメージを返すべきアクションをメソッドに移動します。これはfirst_valid_image(images, accepted_formats)のようなものです。私の意見では、それはのようになります:

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

それは完璧に働いた。ありがとう! –