LoginSignup
4

More than 5 years have passed since last update.

posted at

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

はじめに

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 は動かせたりするので、ケチらなければこんな作業する必要もないのですが、更新頻度が高くない静的ページだけでいけるコンテンツの場合、ありかと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4