在数组

时间:2017-02-25 14:57:28

标签: ruby rake ruby-on-rails-5 file-type

我正在尝试使用Wikipedia gem运行rake任务并匹配第一个图像,即.jpg,.png或.gif以保存到我的机构实例。我正在使用ruby 2.3和Rails 5。

我目前的代码如下:

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的经验!我无法弄清楚最好的办法是什么?是否在其他地方包含方法或是否有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

我建议您,首先检查是否需要更新institute。接下来,如果您想使用accepted_formats,您应该在constant中定义它:ACCEPTED_IMAGE_FORMATS或者像参数一样发送它。 然后你应该移动应该将接受的图像返回给方法的动作,比如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