我希望能够将我的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":字符串
似乎你在想参数可以是对象,由于 Rails 魔法,这可以被原谅。实际上,所有参数都是带有键=值格式键的字符串。
所以这里的问题是,当您使用参数"file"重定向时,它会将您的 Tempfile 对象转换为字符串。这就是为什么错误告诉您没有可访问的方法称为读取或打开字符串的原因。我看到几个选项:
-
对控制器 1 上的文件执行任何操作,而不是重定向到控制器 2。您不必创建额外的对象,访问数据库或在URL中包含疯狂的参数。
-
如果XML可以非常大,最好创建一个名为XmlFile或其他东西的AR对象并将其写入控制器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)
-
如果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])