4
Help us understand the problem. What are the problem?

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
4
Help us understand the problem. What are the problem?