【问题标题】:Ruby on Rails - Storing XML in a Temporary FileRuby on Rails - 将 XML 存储在临时文件中
【发布时间】:2013-01-23 21:28:35
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails ruby xml nokogiri temporary-files


    【解决方案1】:

    您似乎认为参数可以是对象,由于 Rails 的魔法,这可以被原谅。现实中all params are strings with a key in the key=value format.

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

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

    2. 如果 XML 真的很大,最好创建一个名为 XmlFile 的 AR 对象并将其写入控制器 1 中的数据库,然后在参数中使用该 id 进行重定向。这样,您就不必在 URL (which is bad) 中发送疯狂的长 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])
      

    【讨论】:

    • 如果您希望该文件是真正的临时文件,在选项 2 中您可以使用 XmlFile.delete(params[:xml]) 将其删除并同时将其加载到 @xml。跨度>
    • 我非常喜欢您的数据库创意,谢谢!有时候我只是需要别人的意见
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多