RubyでCSVインポータをプログレスバーで作成しようとしています。問題は、SiteControllerは、ProgressBarの変数が初期化されていないことを示しています。どうやってそれを正しくすることができますか?私はコントローラ内の変数にアクセスできる必要があります。しかし、インクルードを使ってうまく動作しないのはなぜですか?ファイル間のRuby共有変数
class SpecificImporter < Importer
include ProgressBar
def import
....
custom logic
Thread.new do
@rows.each do |r|
increment_bar
end
end
end
class Importer
attr_accessor :file
include ProgressBar
def calculate_max_rows
l = File.open(@file.path).count
set_max_rows(l)
end
end
module ProgressBar
attr_reader :cur,:max
def increment_bar
@cur += 1
end
def set_max_rows(val)
@max = val
end
def progress
@cur/@max
end
end
class SiteController < ApplicationController
include ProgressBar
def update_progress
..
#send data using json every x seconds
..
status = progress
end
end
注意親クラスがすでにそれを行っているので、 'SpecificImporter'が' ProgressBarをインクルードする '必要はないはずです。 – tadman
さらに、 'set_max_rows'のようなものはRubyの精神に反するものです。その属性に書き込めるようにするには、 'max ='メソッドを与える 'attr_accessor'を使います。わかりやすくするために、その属性を 'max_rows'と呼んで、代わりに' self.max_rows = l'を行うことができます。 – tadman