Ruby
Rails

Rails で作成した画面を静的に出力する

More than 1 year has passed since last update.


はじめに

Rails に慣れているとちょっとしたシンプルなサイトでも Rails で作りたくなってしまうのですが、レンタルサーバなどで Rails を動かすのは費用面でもパフォーマンス面でもいまいちだったりします。

画面生成以外にサーバ側の処理が必要ないというのが前提になりますが、ローカルで静的ファイルとして出力して、html ファイルを無料レンタルサーバにアップするという作業をしたので、残しておきます。


URL設計

Rails は、/コントローラ名/ID のようなURLになるのが基本かと思いますが、これだと静的ファイルになったときにアクセスできないので、routes.rb には下記のように拡張子 html をつけて、登録しました。


routes.rb

get '/comic/:id.html', to: 'comic#show'



静的ファイルの出力

実は昔も、これと同じことをやったことがあったのですが、そのときは Rails のページキャッシュを使いました。

出力したい画面の URL の Array をひたすらコールしてページキャッシュを作っていく、という方法でした。

ただ調べたところ、Rails 4 からはページキャッシュはなくなり gem として入れないといけないとのこと・・・

今回はキャッシュを使いたいというわけではないので、これだけのために gem 入れるほどでもないだろうということで、自力で出力することにしました。といっても下記の通り、簡単なコードです。


output.rb

require 'open-uri'

HOST = "http://localhost:3000"

def output_html(array)
for path in array
url = HOST + path
open(url) do |html|
path = (path == "/") ? "/index.html" : path
file_path = Dir.pwd + "/html" + path
file_dir = File.split(file_path)[0]
FileUtils.mkdir_p(file_dir) unless FileTest.exist?(file_dir)
open(file_path, "w+b") do |file|
file.write(html.read)
end
end
end
end

# ここで出力したいURLの一覧の array を作成するだけ
array = Array.new
array.push "/"
array.push "/comic/2.html"
array.push "/comic/3.html"
array.push "/comic/5.html"
array.push "/comic/6.html"

output_html(array)


現状はこれでやっていますが、もっと良い手段はあるのかもしれません。

月数百円の VPS でも Rails は動かせたりするので、ケチらなければこんな作業する必要もないのですが、更新頻度が高くない静的ページだけでいけるコンテンツの場合、ありかと思います。