繁体   English   中英

Ruby on Rails-将XML存储在临时文件中

[英]Ruby on Rails - Storing XML in a Temporary File

我希望能够将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)

给我这个错误:“ File:0x6ebfb00”的未定义方法'read':字符串

版本#2

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

给我这个错误:调用“ #File:0x6a12bd8”的私有方法“ open”:字符串

似乎您在考虑参数可以是对象,由于Rails的魔力可以原谅这些对象。 实际上, 所有参数都是带有key = value格式键的字符串。

因此,这里的问题是,当您使用参数'file'重定向时,它将Tempfile对象转换为字符串。 这就是为什么该错误告诉您没有可访问的方法称为字符串读取或打开的原因。 我看到一些选择:

  1. 对控制器1上的文件进行任何处理,而不必重定向到控制器2。您无需创建额外的对象,访问数据库或在URL中添加疯狂的参数。

  2. 如果XML确实很大,最好制作一个名为XmlFile的AR对象,然后将其写入Controller 1中的数据库,然后在参数中使用该ID进行重定向。 这样,您就不必在URL中发送疯狂的长XML字符串( 这是很糟糕的 ):

     # 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作为纯文本的参数发送(这似乎与您当前正在执行的操作最接近,但给我的感觉不太优雅),但是您可能会遇到URL编码问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM