Ruby on Rails でのベスト プラクティスに関する情報が必要です。特にController では多くのことを行う必要があるため、単純な「表示」アクションは行数までです。私はそれが本当に良くないことを知っています、そして私はそれに特定のコードを持っています。
サンプルコードは次のとおりです。
def show
sound = Sound.find(params[:id])
@xml_path = File.dirname(sound.file.path)
s3 = AWS::S3.new(
:access_key_id => 'XXX',
:secret_access_key => 'XXX')
@url = s3.buckets['dev'].objects[sound.file.path[1..-1]].url_for(:read, :expires => 10*60)
if sound.id_job != 0 && sound.transcript_progress != 100
@response = Savon.client("http://srap.php?wsdl").request(:avance) do
soap.body = {
:Jeton => "abcdef",
:ID_job => sound.id_job,
}
end
@response = @response.to_hash
@progress = @response[:avance][:avancement].to_s.split("#")[1]# ID_job received is formed like "OK#123", we keep "123"
if @progress == "Termine"
sound.transcript_progress = 100
elsif @progress == "ERROR"
flash.now[:alert] = "Oups, il semblerait que le fichier soit illisible, ou qu'il n'y ait rien a ecouter !"
elsif @progress != "Queued"
sound.transcript_progress = @response[:avance_response][:avancement].to_s.split("#")[2].split("%")[0].to_i
end
sound.save
end
if sound.transcript_progress == 100 # If transcription finished
# Get XML File URL on the FTP
@xml_path = Savon.client("http://srap.php?wsdl").request(:donneResultat) do
soap.body = {
:Jeton => "XXX",
:FichierSon => sound.id_job
}
end
# Parse XML Path URL on Kimsufi
@xml_path = @xml_path.to_hash[:donne_resultat_transposition_response][:chemin_fichier].to_s.split("#")[2].to_s.split("/")[5]
# Create local directory (/tmp/sounds) for XML Temp Save
if ! File.directory?(Rails.root.to_s + '/tmp/sounds')
Dir.mkdir(Rails.root.to_s + '/tmp/sounds')
end
# Get XML from FTP
ftp=Net::FTP.new
ftp.connect("ftp.com", 21)
ftp.login("XXX", "XXX")
if ftp.closed?
flash.now[:alert] = "Oups, il semblerait qu'il y ait eu un problème ! Merci d'actualiser la page"
else
ftp.passive = true
ftp.chdir('results')
ftp.getbinaryfile(@xml_path, Rails.root.to_s + '/tmp/sounds/' + @xml_path)
ftp.close
end
# Send XML on S3
s3 = AWS::S3.new(
:access_key_id => 'XXX',
:secret_access_key => 'XXX')
@xml_new = (File.dirname(@sound.file.path) + '/' + File.basename(@xml_path))[1..-1]
s3.buckets['dev'].objects[@xml_new].write(Pathname.new(Rails.root.to_s + '/tmp/sounds/' + @xml_path))
@file = s3.buckets['dev'].objects[@xml_new].read()
end
# A lot of logic again, i've not did it yet
end
ご覧のとおり、ここには多くのロジックがあります。トランスクリプションが終了したかどうかを確認する必要があります。そうでない場合は、progress_bar (@sound.transcript_progress) を更新します。はいの場合は、最初に SOAP アクションに接続して取得する必要がありますXML パス、次に FTP 経由で XML を取得し、それを Amazon S3 にストックします (くだらない SOAP、すべての応答を再解析する必要があります...)。
私のすべてのアクションコントローラーで、同じ順序ではなく、S3 / SOAP / FTPに接続する必要があります..だから、C ++のように、抽象化であるそれぞれのクラスを作成することを考えています。私は物事を成し遂げたい、私はそれがどのように行われたか(あまり)気にしません. しかし、MVC のベスト プラクティスは何ですか? 新しいフォルダ「Class?」を作成する必要があります。新しいコントローラー?