2012-09-30 73 views
0

保存當前頁面,我需要有一個按鈕來保存當前網頁(就像點擊「另存爲」),我創建了任何外部網站的偉大工程的控制器的方法(如http://www.google.com),但不適用於我的應用程序內的網站,我收到超時錯誤!這種說法沒有解釋,我:(按鈕,在軌3.2

任何線索是什麼問題?

#CONTROLLER FILE 
def save_current_page 
    # => Using MECHANIZE 
    agent = Mechanize.new 
    page = agent.get request.referer 
    send_data(page.content, :filename => "filename.txt") 
end 

我也試過打開URI,同樣的問題!

#CONTROLLER FILE 
def save_current_page 
# => USANDO OPEN URI 
send_data(open(request.referer).read, :filename => "filename.txt") 
end 

我使用軌道3.2和紅寶石1.9,任何幫助表示讚賞,我已經花了像10小時試圖使其工作!

回答

0

幾個小時,和許多其他職位我得到一個最終的解決方案後:

布里克是正確的,因爲它是不可能的軌道,只渲染不止一次在通話中,從http://guides.rubyonrails.org/layouts_and_rendering.html採取「能渲染或重定向一次每個動作「

該網站還聲明」規則是,如果您沒有明確呈現控制器操作結束時的某些內容,Rails將自動查找控制器中的action_name.html.erb模板查看路徑並渲染它。「

然後,對我來說很好的解決方案是告訴控制器如果下載標誌(download = true)被設置爲:params(我也使用request.url來讓它工作鑑於我的應用程序)

查看:

= link_to 'Download', request.url+"&downloadexcel=true", :class => 'btn btn-primary btn-block' 

控制器:

def acontrolleraction 
    #some controller code here 
    if params[:downloadexcel] 
    save_page_xls 
    else 
    # render normally 
    end 
end 


def save_page_xls 
    #TRESCLOUD - we create a proper name for the file 
    path = URI(request.referer).path.gsub(/[^0-9a-z]/i, '') 
    query = URI(request.referer).query.gsub(/[^0-9a-z]/i, '') 
    filename = @project_data['NOMBRE']+"_"+path+"_"+query+".xls" 

    #TRESCLOUD - we render the page into a variable and process it 
    page = render_to_string 

    #TRESCLOUD - we send the file for download! 
    send_data(page, :filename => filename, :type => "application/xls") 
end 

感謝您的建議!

0

的Rails只能同時處理一個請求,這兩個請求之間永無止境的僵局 - 第一個請求等待第二個請求,但第二個請求正在等待第一個請求,因此您會收到Timeout錯誤。即使您使用Passenger或其他東西運行應用程序的多個實例,也不是一個好主意。

我能想到繞過它是使用條件語句,像這樣的唯一方法:

referer = URI.parse(request.referer) 

if Rails.application.config.default_url_options[:host] == referer.host 
    content = "via yoursite.com" 
else 
    agent = Mechanize.new 
    page = agent.get request.referer 
    content = page.content 
end 

send_data content, filename: "filename.txt" 

有點髒,但它應該得到解決的超時問題。至於從您自己的網站獲取網頁的實際內容 - 這取決於您。您可以渲染模板,從緩存中獲取某些內容,或者忽略它。

一個更好的解決辦法是排隊這個代碼轉換成類似Resque或延遲工作。然後隊列可以發出請求並排隊等待以正常的方式請求頁面。這也意味着用戶不必等待應用程序發出遠程請求,這很危險,因爲誰知道頁面響應需要多長時間。

+0

布里克嗨,嗨夥計感謝您抽出時間討論這個。 –

+0

Hi Bricker,我認爲它仍然沒有解決它,這個應用程序應該保存當前頁面,這將是myapp.com/something,但建議的解決方案看起來像只會保存一個外部網站,如www.google。com並排除當地網站。然而,我測試了它,問題依然存在(無法解釋爲什麼,如果應該工作並避免本地場景中的環路)。嘿,夥計,感謝您花時間幫助我解決這個問題。 –

+0

是的,你需要決定如何處理獲取本地網站。你根本不能讓應用程序向自己發出遠程請求,即使你正在運行應用程序的多個實例,它仍可能卡住。確保您的'Rails.application.config.default_url_options [:host]'與來自應用程序中的頁面的'referer.host'相匹配。 – bricker