4

私は 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 になります。その理由を読んで、私はその考えを理解したと思いますが、解決策は何ですか? レールのコントローラーでメソッド間で値を共有する簡単な方法はありますか? ここで同様の質問を見つけましたが、回答ではモデルで計算を行うことが推奨されていましたが、それは私の目的にも当てはまりますか?

4

2 に答える 2