Rails 的真正静态页面

Really static pages with Rails

应用程序中的某些页面必须可以访问,即使应用程序已关闭。例如 50x 错误的页面。最简单的方法是创建静态 HTML 页面,这些页面将由网络服务器(如 Nginx 上的 apache)提供服务。这些页面中的大部分都与应用程序有共同的布局。因此,如果我们更改应用程序中布局的某些部分,我们必须手动更改所有静态页面。

将 rails 页面存储为静态文件并根据项目中的相同更改重新创建它(自动或通过 rake 任务)的最佳方法是什么? rails 的任何 gem 或能够重用 rails 布局和资源(CSS、js、图像)的静态站点生成器。

通常,静态内容位于您的 public 文件夹中,您可以配置 Nginx 或等效路由以相应地路由到该文件夹​​,甚至无需点击 Rails。

对于 Ruby 中的静态站点生成,您可能需要查看 Jekyll https://jekyllrb.com/。您可以将 Jekyll 站点与 Rails 站点分开管理,并在部署时生成静态 HTML/CSS/JS。有一个 jekyll watch 命令可以侦听文件编辑并相应地编译您的静态内容。

有简单的 rake 任务(通过 GIST)从 VIEW_PATH 加载所有文件,用应用程序布局包装它并将它存储在 public 中的相同路径下。使用 Rails 4.

https://gist.github.com/potapuff/090b2da4a4156c1272430241cb70edc0

namespace :static do
  desc 'Render all resources'
  task :publicate => :environment do
    resources(VIEW_PATH).each do |src, dest|
      html= controller.render_to_string(file:src, layout:'application')
      dirname = File.dirname(dest)
      unless File.directory?(dirname)
        FileUtils.mkdir_p(dirname)
      end
      File.write(dest, html)
    end
  end

  def resources search_path
      ... 
  end

  def controller
    ApplicationController.new.tap do |controller|
       ...
    end
  end
end

其他可能性是使用 gem render_anywhere .

在 Rails 5 中,我们有新的能力来使用外部渲染控制器 https://medium.com/evil-martians/the-rails-5-post-9c76dbac8fc#1b36