2013-01-23 41 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