Help us understand the problem. What is going on with this article?

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

tomalatte001
ウェブ系のフリーランスエンジニアです。 大学在学中に公認会計士資格取得後、監査法人で勤務。その後、ウェブ系SIerにエンジニアとして転職し、ウェブサービス開発のPM、開発リーダー、アーキテクトなど一通り経験しました。 スマホアプリ開発も勉強中。 Java/Ruby,Rails/Python/Javascript/MySQL
http://tomalatte.com/
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした