回答这个我自己,周围挖后:系统位做,但不是&。 Delayed_job是继续下去的方法。 FWIW这里是我的工作代码,用于在Heroku的Cedar堆栈上使用delayed_job在rails 3.1应用程序中运行rake任务,以生成XML文件,将其保存为temp,然后上传到S3。 XML输出文件很大,因此需要异步处理它。
应用程序/类/ callrake.rb:
class Callrake
def call_rake(task, options = {})
options[:rails_env] ||= Rails.env
args = options.map { |n, v| "#{n.to_s.upcase}='#{v}'" }
system "rake #{task} #{args.join(' ')} --trace 2>&1 >> #{Rails.root}/log/rake.log"
end
handle_asynchronously :call_rake
end
的ISBN控制器:
def onixtwo
#using Ransack, successor to Metasearch
@q = Isbn.where(:client_id => current_user.client_id).search(params[:q])
@isbns = @q.result(:distinct => true)
if @q.nil?
@isbns = Isbn.where(:client_id => current_user.client_id)
end
#I have an array to pass so this is a bit hacky - make an array, pass it as a string then turn it back into an array using eval()
is = []
@isbns_to_pass = @isbns.each {|isbn| is << isbn.id }
@client = current_user.client_id
@user = current_user.id
callrake = Callrake.new
callrake.call_rake(:onixtwo, :isbns => is, :client => @client, :user => @user)
redirect_to isbns_path, :flash => { :notice => t(:isbnonixtwo).html_safe }
end
稍微偏离主题配置/语言环境/出于完整性en.yml:
en:
isbnonixtwo: "Onix 2.1 message is generating. When it's done, you can download it from the <a href='/onixarchives'>Onix Archive</a> list."
耙任务:
desc "Generate an onix 2.1 xml file"
task :onixtwo => :environment do |t|
client_id = ENV["CLIENT"]
user_id = ENV["USER"]
isbns_passed = ENV["ISBNS"]
isbnsarray = eval(isbns_passed)
filename = "#{Rails.root}/public/#{Client.find_by_id(client_id).client_name}-#{Date.today}-#{Time.now}-onix-21.xml"
isbns = Isbn.find_all_by_id(isbnsarray)
File.open(filename, "w") do |file|
xml = Builder::XmlMarkup.new(:target => file, :indent => 2)
xml.instruct!(:xml, :version => "1.0", :encoding => "utf-8")
xml.declare! :DOCTYPE, :ONIXMessage, :SYSTEM, "http://www.editeur.org/onix/2.1/03/reference/onix-international.dtd"
xml.ONIXMessage do
xml.Header do
#masses of code
end #of file
xmlfile = File.open(filename, "r")
onx = Onixarchive.new(:client_id => client_id, :user_id => user_id)
onx.xml = xmlfile
onx.save!
end #of task
然后,Onixarchive在模型中设置了常规回形针附件设置。
请注意文件路径中的Rails.root.public - 当我尝试写入app/tmp时,我不断收到“不存在”,因为当我使用heroku的控制台查看时,没有tmp文件夹。我想我可以创建一个,但这个应用程序是雪松,它有一个ephemeral filesystem,所以你可以在会话期间写任何地方。