2013-01-23 111 views
1

我希望能够将我的xml存储到临时文件中,然后将其发送到另一个控制器中的另一个方法进行处理。目前它不允许我一次发送就读取文件,因为它是一种私人方法。Ruby on Rails - 将XML存储在临时文件中

控制器#1

xml_doc = Nokogiri::XML(@builder.to_xml) 
@tempfile = Tempfile.new('xml') 
@tempfile.write(xml_doc) 
redirect_to upload_xml_admin_events_path(:file => @tempfile) 

控制器#2

版本#1

xml = params[:file].read 
xmldoc = Nokogiri::XML(xml) 

给了我这个错误:未定义的方法`读”为 “文件:0x6ebfb00”:字符串

版本#2

xml = params[:file] 
xml.open 
xmldoc = Nokogiri::XML(xml) 

给了我这个错误:私有方法'开放”呼吁‘#FILE:0x6a12bd8’:字符串

回答

1

好像你以为PARAMS可以是对象,这是可以原谅的,由于Rails的魔术。在现实中all params are strings with a key in the key=value format.

所以这里的问题是,当你与参数“文件”重定向,原来你的将它视为对象转换为字符串。这就是为什么错误告诉你没有可访问的方法称为读取或打开字符串。我看到几个选项:

  1. 做你会与控制器1,而不是重定向到控制器2.您将不必创建额外的对象文件做,打了一个数据库,或有疯狂参数在您的网址。

  2. 如果XML可能真的很大,那么最好制作一个名为XmlFile的AR对象,并将其写入控制器1中的数据库,然后使用参数中的该ID进行重定向。这样一来,你就不必在URL发送疯狂的长XML字符串中(which is bad):

    # Controller 1 
    @xml = XmlFile.new(@builder.to_xml) 
    redirect_to upload_xml_admin_events_path(:xml => @xml) #implicitly @xml.to_s 
    
    # Controller 2 
    @xml = XmlFile.find(params[:xml]) 
    Nokogiri::XML(@xml) 
    
  3. 如果XML始终是(非常)小,你可以发送XML作为纯文本设置了一个param (这似乎与您目前正在做的最接近,但让我觉得不够优雅)您可能会遇到URL编码问题。

    # Controller 1 
    xml = @builder.to_xml 
    redirect_to upload_xml_admin_events_path(:xml => xml) 
    
    # Controller 2 
    @xml = Nokogiri::XML(params[:xml]) 
    
+0

如果你想该文件是真正的临时工,在选项2,你可以使用XmlFile.delete(PARAMS [:XML])将其删除,并在同一时间将其加载到@xml。 – rurabe

+0

我很喜欢你的数据库创意,谢谢!有时候我只是需要别人的意见 – user1977840