Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails—将XML存储在临时文件中_Ruby On Rails_Ruby_Xml_Nokogiri_Temporary Files - Fatal编程技术网

Ruby on rails RubyonRails—将XML存储在临时文件中

Ruby on rails RubyonRails—将XML存储在临时文件中,ruby-on-rails,ruby,xml,nokogiri,temporary-files,Ruby On Rails,Ruby,Xml,Nokogiri,Temporary Files,我希望能够将xml存储到一个临时文件中,然后将其发送到另一个控制器中的另一个方法进行处理。目前,它将不允许我读取文件,一旦发送,因为它是一个私有方法 控制器#1 控制器#2 版本#1 给我这个错误:未定义“File:0x6ebfb00”的“read”方法:String 版本#2 给我这个错误:私有方法'open'调用了“#File:0x6a12bd8”:String似乎您认为参数可以是对象,由于Rails的魔力,这是可以原谅的。实际上 所以这里的问题是,当您使用参数'file'重定向时,它会将T

我希望能够将xml存储到一个临时文件中,然后将其发送到另一个控制器中的另一个方法进行处理。目前,它将不允许我读取文件,一旦发送,因为它是一个私有方法

控制器#1

控制器#2

版本#1

给我这个错误:未定义“File:0x6ebfb00”的“read”方法:String

版本#2


给我这个错误:私有方法'open'调用了“#File:0x6a12bd8”:String

似乎您认为参数可以是对象,由于Rails的魔力,这是可以原谅的。实际上

所以这里的问题是,当您使用参数'file'重定向时,它会将Tempfile对象变成字符串。这就是为什么错误会告诉您,对于字符串,没有称为read或open的可访问方法。我看到一些选择:

  • 对控制器1上的文件执行任何操作,而不是重定向到控制器2。您不必创建额外的对象、访问数据库或在URL中设置疯狂的参数

  • 如果XML非常大,那么最好创建一个名为XmlFile的AR对象,并将其写入控制器1中的数据库,然后在参数中使用该id重定向。这样,您就不必在URL()中发送过长的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])
    

  • 如果您希望该文件是真正临时的,在选项2中,您可以使用XmlFile.delete(params[:xml])将其删除,同时将其加载到@xml。我非常喜欢您的数据库想法,谢谢!有时候我只是需要别人的意见
    xml = params[:file].read
    xmldoc = Nokogiri::XML(xml)
    
    xml = params[:file]
    xml.open
    xmldoc = Nokogiri::XML(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)
    
    # Controller 1
    xml = @builder.to_xml
    redirect_to upload_xml_admin_events_path(:xml => xml)
    
    # Controller 2
    @xml = Nokogiri::XML(params[:xml])