2012-11-13 169 views
1

我需要从数据库表生成所有我的产品到XML文件。因为我的应用程序在Heroku上运行,所以我需要使用Amazon S3作为存储。Rails - 如何创建文件(XML)并将其保存到Amazon S3存储桶中?

下面是如何保存的图像的例子:

has_attached_file :photo, 
     :styles => { 
     :thumb=> "100x100#", 
     :small => "400x400>" }, 
    :storage => :s3, 
    :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", 
    :path => "/:style/:id/:filename" 

这让我有点糊涂......因为我不知道这个任务的逻辑。 我的想法是运行在Products控制器

xml = Builder::XmlMarkup.new(:indent => 2) 
xml.instruct! :xml, :encoding => "ASCII" 
xml.product do |p| 
    p.name "Test" 
end 

的动作(比如create_xml_feed),但来这里的问题 - 我不知道,如何保存新创建的文件到Amazon S3的桶。

我会很感激每一个进步,谢谢

回答

5

首先,创建活动记录类来保存您上传的XML文件。在此之后,您可以编写创建xml字符串的逻辑,首先创建一个新的XmlUploader类实例,然后创建所需的xml字符串,将其保存在文件中,然后将该文件分配为附件。一旦你保存你的xml文件就会上传到s3。

class XmlUploader < ActiveRecord::Base 
    has_attached_file :uploaded_file, :storage => :s3, 
    :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", 
    :path => "/:id/:filename" 

    def create_uploaded_file 
    xml = ::Builder::XmlMarkup.new(:indent => 2) 
    xml.instruct! :xml, :encoding => "ASCII" 
    xml.product do |p| 
     p.name "Test" 
    end 
    file_to_upload = File.open("some-file-name", "w")  
    file_to_upload.write(xml) 
    file_to_upload.close() 
    self.uploaded_file = File.open("some-file-name") 
    self.save! 
    end 
end 

class CreateXmlUploaders < ActiveRecord::Migration 
    def change 
    create_table :xml_uploaders do |t| 
     t.attachment :uploaded_file 
     t.timestamps 
    end 
    end 
end 

xml_file = XmlUploader.new 
xml_file.create_uploaded_file 
+0

谢谢你的回答,Nakort。我试图实现它,但是在保存文件时出现了错误 - 对于#',未定义的方法'uploaded_file ='。我运行代码,如'XmlUploader.create_uploaded_file()'。你能给我一个关于如何解决它的提示吗?谢谢 – user984621

+0

你需要创建一个XmlUploader类的实例,我会更新答案。 ' – Nakort

+0

对于另一个问题 - 这个'xml_file = XmlUploader.new xml_file.create_uploaded文件'应该在控制器的操作中,我很抱歉?当我把它放在那里并运行代码时,我得到#的'未定义的局部变量或方法文件'。对不起,我只是有点困惑......谢谢。 – user984621

相关问题