我在rails网站上有一个ruby。使用ruby和rails动态加载和生成页面。但是,我还想生成一个静态.html页面来简化我的服务器,而不是每次都调用rails页面。
在PHP中,我知道如何使用ob_start()和ob_get_contents()来获取输出缓冲区以获取输出文本。
如何将rails页面的输出捕获到变量中?
编辑:我想这样做的原因是我可以将我的页面保存为.html以便在其他机器上使用。所以我使用ruby生成HTML并以他们可以查看的格式分发给其他人。
答案 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