Savroff
Savroff

Reputation: 79

Nokogiri+Paperclip = XML parse with img from url

I need to parse some params to my DB and image from URL.

I use paperclip for image.

In Rails console I can add image to new post by this code:

    image = Image.new
    image.image_from_url "http://yug-avto.ru/files/image/tradein/hyundai/877_VOLKSWAGEN_FAETON_2011_2_1366379491.jpg"
    image.watermark = true
    image.save!

in my Image model I have

require "open-uri"
.......
def image_from_url(img_url)
  self.image = open(img_url)
end

And all work done. But when I use Nokogiri, this code don't work.

rake aborted!
No such file or directory - 
http://yug-avto.ru/files/image/tradein/peugeot/1027_Peugeot_308_2011_2_1370850441.jpg

My rake task for Nokogiri parse:

doc.xpath("//item").each do |ad|
 img = ad.at("image").text

 img1 = Image.new
 img1.image = open("#{img}") 
 img1.watermark = true
 img1.save!
end

In rake task for Nokogiri, I have require 'nokogiri' and require 'open-uri'.

How to be?:))))

Upvotes: 0

Views: 771

Answers (2)

davegson
davegson

Reputation: 8331

This is a code snippet from my parser... I guess where you went wrong is using open(url) instead of parse(url).

picture = Picture.new(
    realty_id: realty.id,
    position: position,
    hashcode: realty.hashcode
)
# picture.image = URI.parse(url), edit: added open() as this worked for Savroff
picture.image = open(URI.parse(url))
picture.save!

Additionally it would be a good idea to check if the image really exists

picture_array.each do |url|

    # checks if the Link works
    res = Net::HTTP.get_response(URI.parse(url))

    # if so, it will add the Picture Link to the verified Array
    if res.code.to_i >= 200 && res.code.to_i < 400 #good codes will be betweem 200 - 399
        verified_array << url
    end
end

Upvotes: 3

Savroff
Savroff

Reputation: 79

Thanks TheChamp, you led me to the right thoughts. First need to parse URL and after that open.

image = Image.new
ad_image_url = URI.parse("#{img}")
image.image = open(ad_image_url)
image.watermark = true
image.save!

Upvotes: 3

Related Questions