我正在 Rails 3.0 中构建一个简单的网站生成器应用程序。我想要一个控制器中的“发布”操作,它的工作方式与普通的“显示”操作一样,而是将页面作为 HTML 文件保存在“公共”目录中,而不是在浏览器中显示。也就是说,我想使用 Rails 渲染机制来创建文件,而不是提供 HTTP 响应。
最好的方法是什么?
我应该简单地添加caches_page :publish
到控制器吗?
还是使用render_to_string
and File.new
?
我正在 Rails 3.0 中构建一个简单的网站生成器应用程序。我想要一个控制器中的“发布”操作,它的工作方式与普通的“显示”操作一样,而是将页面作为 HTML 文件保存在“公共”目录中,而不是在浏览器中显示。也就是说,我想使用 Rails 渲染机制来创建文件,而不是提供 HTTP 响应。
最好的方法是什么?
我应该简单地添加caches_page :publish
到控制器吗?
还是使用render_to_string
and File.new
?
您可以使用render_to_string
方法:http ://apidock.com/rails/AbstractController/Rendering/render_to_string
不过,您仍然需要从控制器做出响应。也许重定向到您刚刚保存的页面?
我会使用页面缓存。
然后,如果您有可编辑的内容,则应自动生成页面。然后,您可以编写一个系统任务,将它们捆绑为一个网站。
有关说明,请参见(无论如何)/actionpack/lib/action_controller/caching/pages.rb。
我发现使用页面缓存caches_page
对我不起作用,因为在缓存页面后无法显示通知或重定向到另一个页面。该方法render_to_string
(由@Grocery 建议)是要走的路。这是示例控制器代码:
def publish
@article = Article.find(params[:id])
html = render_to_string(:template => "articles/template.html.haml", :layout => 'article' )
FileUtils.makedirs("#{Rails.root}/public/articles/") unless File.exists?("#{Rails.root}/public/articles/")
File.open("#{Rails.root}/public/articles/#{@article.filename}.html", 'w') {|f| f.write(html) }
respond_to do |format|
format.html # publish.html.erb
end
end