私は Ruby on Rails を学ぼうとしているので、私が行っているプロジェクトの 1 つは、URL を入力して [送信] をクリックすると、サーバーがその URL からファイルのダウンロードを開始するアプリを開発することです。ダウンロードの詳細 (サーバーから定期的に更新)。Ruby のインスタンス変数とクラス変数のいくつかの特異性について理解できていませんでした。さらに恐ろしいことをしてしまいました。
class ProgressWebsController < ApplicationController
layout "application"
include ActionController::Live
before_action :set_progress_web, only: [:edit, :update, :destroy]
@@thread
@@test=0
@@clonePW
# GET /progress_webs
# GET /progress_webs.json
def index
@progress_web=ProgressWeb.new
end
def updateProgress
puts "Not gonna happen"
end
# GET /progress_webs/1
# GET /progress_webs/1.json
def show
puts "Downloading %s" % @@clonePW['url'].to_s
@@thread = download(@@clonePW['url'].to_s)
@progress_web=@@clonePW
@@start = Time.now
end
# GET /progress_webs/new
def new
if( @@test.eql?("100.00"))
puts "DOWNLOAD COMPLETE"
@@thread.exit
render :partial => "complete", :locals => { :progress_int => @@test, :done_int =>@@done, :elapsed_int =>@@elapsed_int }
return
end
@@test= "%.2f" % @@thread[:progress].to_f
@@done= "%d" % @@thread[:done]
now = Time.now
elapsed =now - @@start
@@elapsed_int="%d" % elapsed
render :partial => "progress", :locals => { :progress_int => @@test, :done_int =>@@done, :elapsed_int =>@@elapsed_int }
end
def download(url)
Thread.new do
thread = Thread.current
body = thread[:body] = []
url = URI.parse url
Net::HTTP.new(url.host, url.port).request_get(url.path) do |response|
length = thread[:length] = response['Content-Length'].to_i
response.read_body do |fragment|
body << fragment
thread[:done] = (thread[:done] || 0) + fragment.length
thread[:progress] = thread[:done].quo(length) * 100
end
end
end
end
まず、updateProgress メソッドを呼び出すことができませんでした。「show」を続け、「updateProgress」をパラメータ「id」として渡しました。これをいじる代わりに、「新しい」メソッドをハイジャックし、ダウンロードステータスの更新が必要になるたびにjQueryを呼び出すようにしました。これを許してください、私はおそらく基本を学ぶ前に噛むことができる以上に噛み砕きました.
次に、インスタンス変数の代わりにクラス変数を使用する必要があったため、一度に 1 人しかこの Web アプリケーションを使用できません。インスタンス変数を使用した場合、あるメソッドが別のメソッドが設定したはずの値を参照するまでに、インスタンス変数は nil になります。その理由を読んで、私はその考えを理解したと思いますが、解決策は何ですか? レールのコントローラーでメソッド間で値を共有する簡単な方法はありますか? ここで同様の質問を見つけましたが、回答ではモデルで計算を行うことが推奨されていましたが、それは私の目的にも当てはまりますか?