【发布时间】:2012-08-12 15:21:13
【问题描述】:
我需要一些关于 Ruby on Rails 中的最佳实践的信息,尤其是对于必须做很多事情的控制器,所以,一个简单的“展示”动作现在已经到线了。我知道,这不是很好,而且我有特定的代码。
这是一个示例代码:
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), 如果是,我首先必须连接到一个肥皂操作来获取 XML 路径,然后通过 FTP 获取 XML,然后将其存储到 Amazon S3(糟糕的 SOAP,我必须重新解析所有响应......)。
在我所有的动作控制器中,我必须连接 S3 / SOAP / FTP,而不是 以相同的顺序..所以我想为每个人上一堂课,比如 C++,一种抽象。我想把事情做好,我不在乎(很多)如何 完成。但是 MVC 的最佳实践是什么?我必须做一个 新文件夹“类?”新控制器?
【问题讨论】:
-
先提示几个提示:
else if应该是elsif,if (ftp.closed? == true)应该是if ftp.closed? -
为什么要分配给
sound,然后复制到@sound? -
谢谢 2,我刚刚编辑了。关于@sound 中的声音副本,我不知道为什么,但在第一个 SOAP 范围内,@sound.id 无效,而 sound.id 有效。所以为了调试,我正在这样做。
-
带前导
@的变量在控制器操作范围之外可用 - 只有当这些变量需要在您的视图中可用时,您才需要使用它。 -
这是一篇关于 Fat Models 和 Skinny Controllers 的好博文:weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model,在您的情况下,最好考虑 Fat Libraries 和 Skinny Controllers。
标签: ruby-on-rails ruby model-view-controller ruby-on-rails-3.2