2010-04-03 29 views
4

當我加載/ reports/generate_report時,我的rails應用程序會生成XML。在Rails中將頁面加載到內存中

單獨的頁面上,我想將此XML讀入一個變量並將其保存到數據庫中。

我該怎麼做?我能以某種方式將來自/reports/generate_report.xml URI的響應流式傳輸到變量中嗎?還是有更好的方法來做到這一點,因爲XML是由同一個Web應用程序生成的?

這裏是我的generate_report行動:

class ReportsController < ApplicationController 
    def generate_report 
    respond_to do |format| 
     @products = Product.all 
     format.xml { render :layout => false } 
    end 
    end 
end

這裏是我嘗試寫的操作:

class AnotherController < ApplicationController 
    def archive_current 
    @output = # get XML output produced by /reports/generate_report 
    # save @output to the database 

    respond_to do |format| 
     format.html # inform the user of success or failure 
    end 
    end 
end

解決:我的解決方案(感謝姆拉登Jablanović):

@output = render_to_string(:file => 'reports/generate_report.xml.builder')

我在模型類中使用了下面的代碼來完成中國語,因爲render_to_string相同的任務是(白癡)的ActionController ::基地的保護方法:

av = ActionView::Base.new(Rails::Configuration.new.view_path) 
@output = av.render(:file => "reports/generate_report.xml.builder")
+0

只是好奇你爲什麼試圖將你的數據轉換成XML然後再保存到數據庫。 – Salil 2010-04-03 06:56:11

+0

@Salil:我想將先前版本的數據存儲在數據庫中,有點像版本控制。 – titaniumdecoy 2010-04-03 22:44:50

回答

2

也許你可以提取您的XML渲染邏輯相同的控制器(可能是私人的)中的一個單獨的方法,這將使得XML使用render_to_string一個字符串,並從generate_reportarchive_current行動稱之爲兩者兼而有之。

+0

我能夠使用@output = render_to_string(:file =>'reports/generate_report.xml.builder')將頁面呈現爲字符串而不做任何更改。謝謝你的幫助。 – titaniumdecoy 2010-04-03 22:42:03

1

我通常做這種情況是創建一個單獨的模塊/類/模型來生成報告(它甚至可能在產品模型中是正確的)。這個單獨的組件可能在app/models或它可能在lib。無論如何,一旦你將它提取出來,你可以在任何你需要的地方使用它。控制器可以直接調用它。您可以從控制檯生成它。你可以有一個cron作業生成它。這不僅更爲靈活,而且如果報告生成速度緩慢,它也可以幫助您平滑請求響應時間。

由於您使用的是模板,控制器路由很方便,但即使您必須在輔助庫中包含某種類型的ruby模板系統也是可以理解的,但它仍然可能不會那麼麻煩,而且更靈活通過控制器。

1

@output = Product.all.to_xml

0

對不起,是你約XML或約會議的問題?我的意思是,你的行爲是否爲這個問題產生了Xml材料?或者你只是想保存後期使用的動作輸出?
您在「單獨」頁面上說過 - 您是指另一個請求? (就像用戶批准後一樣?) 爲什麼要保存輸出?因爲它應該像渲染一樣保存? (例如,如果用戶點擊以保存一份報告並保存了另一份報告,用戶可能會感到沮喪)或者生成這種東西是否昂貴?
或者可能是,我弄錯了,它是關於重構的?