将ruby上的html从rails输出保存到变量

时间:2011-07-21 05:54:29

标签: ruby-on-rails ruby-on-rails-3

我在rails网站上有一个ruby。使用ruby和rails动态加载和生成页面。但是,我还想生成一个静态.html页面来简化我的服务器,而不是每次都调用rails页面。

在PHP中,我知道如何使用ob_start()和ob_get_contents()来获取输出缓冲区以获取输出文本。

如何将rails页面的输出捕获到变量中?

编辑:我想这样做的原因是我可以将我的页面保存为.html以便在其他机器上使用。所以我使用ruby生成HTML并以他们可以查看的格式分发给其他人。

3 个答案:

答案 0 :(得分:9)

您应该使用Rails caching来实现此结果。它实现了您正在寻找的目标。

或者,你可以 render_to_string 并使用渲染输出结果:

 #ticket_controller.rb
 def TicketController < ApplicationController

   def show_ticket
     @ticket = Ticket.find(params[:id])

     res = render_to_string :action => :show_ticket
     #... cache result-- you may want to adjust this path based on your needs
     #This is similar to what Rails caching does
     #Finally, you should note that most Rails servers serve files from
     # the /public directory without ever invoking Rails proper

     File.open("#{RAILS_ROOT}/public/#{params[:action]}.html", 'w') {|f| f.write(res) }
     # or .. File.open("#{RAILS_ROOT}/public/#{params[:controller]}/#{params[:action]}/#{params[:id]}.html", 'w') {|f| f.write(res) }
     # or .. File.open("#{RAILS_ROOT}/snapshots/#{params[:controller]}/#{params[:action]}/#{params[:id]}.html", 'w') {|f| f.write(res) }
     render :text => res
   end
 end

答案 1 :(得分:2)

您可能希望查看缓存,而不是直接保存rails应用的输出。退房:

答案 2 :(得分:0)

我最终选择了以下内容:

@page_data = render_to_string() # read the entire page's output to string

if (File.exist?('../cache.html'))
    file = File.open('../cache.html','rb')
    contents = file.read
else
    contents = ''
end
if (@page_data!=contents) # if the page has changed
    # save the output to an html version of the page
    File.open('../cache.html','w') {|f| f.write(@page_data) }
end