新手求救,下載檔案問題求救


#1

Hi 我剛接觸Ruby on Rails 不久而已,目前使用Nokogiri 抓網路上的資料
在本機的時候我用ruby

a=open(html).read
b=Nokogiri::HTML(a)

抓到圖片的url後存成hash
再用each do
z.each do |key,value|
`wget #{value} -P #{folder_name}`
sleep 0.2
end
一次下載所有圖檔,到這邊都OK

但是當我用Rails 的時候要用什麼方法來下載外來的url,一次全部下載 或者是打包成zip下載呢?

目前想做的是一個網站
使用者可以輸入網址,去爬出網站的圖(到這邊ok)
但是我不知道要用什麼方法做一個下載button可以一次全部下載

謝謝各位幫忙 Thank you


#2

hmm…每個玩 Rails 的人都以為 Rails 是主控端,但…其實一直都不是

因為 Rails 是 web application,需要承載一個量,所以之後可能會有 N 個分身一起 run,所以把排程寫在裡面這件事情是很蠢的就是 … 而 sidekiq 是背景工作的收集後執行,同樣的不適合做排程就是

這邊有很多做法,但全部都是用另外一個程式完成這些動作,你可以用 whenever 這個 gem 來幫你寫 cronjob,或是用之前有人一直問我的 rufus-scheduler + god 這兩個 gem 的套組來完成也可以,然而還要配這邊

你就可以得到自由哩,再來是寫法

如果你只有 MySQL 的話,你可以用這樣的寫法來完成

#init 同上文
require 'securerandom'

class Item < ActiveRecord::Base #這邊用 Rails5 要換寫法
  STATUS = [['新增' , 0] , ['處理中' , 1] , ['完成' , 2] , ['錯誤' , 3]]
  #多開一個欄位string:random_token,並加成index
end

#每一個cycle要做這些事情
module Hihi
  def self.process_me!
    #這邊用很蠢但很好用的免lock的寫法
    random_token = SecureRandom.hex(16)
    Item.where('status = 0 AND random_token IS NULL').update_all(:status => 1 , :random_token => random_token)

    #把這邊的東西拿出來,然後把它做完
    Item.where('status = 1 AND random_token = ?' , random_token).each do |item|
      #do something
    end

    #結束,寫入完成狀態
    Item.where('status = 1 AND random_token = ?' , random_token).update_all(:status => 2 , :random_token => nil)
  end
end

#加上排程器,如果你用的是rufus-scheduler
#or 執行自己,如下,如果你用的是 cronjob 或是 whenever
#
#Hihi.process_me!

大概就是這樣唄,你的需求都是後置的,所以想辦法 show status 給 user 看即可,看目前是否處理完了,否則 user 會等太久的,且對系統本身不會有任何好處就是(Rails 會花費 process 然後不能服務別人)