Rails
Rails5

rails5 APIモードでindex.htmlを配信する

More than 1 year has passed since last update.

rails5 APIモードでindex.htmlを配信するための方法をまとめました。

前提

  • rails5.1.2を利用。
  • nginxやCDNを使わずにrails内でソース管理したい。
  • URL設計もroutes.rbで行いたい。

APIモードでhtmlを配信する

静的ページ専用のコントローラーを用意する。
renderメソッドにfileキーを明示して静的ファイルのパスを直指定する。

StaticPagesController.rb
class StaticPagesController < ApplicationController
  def index
    render file: 'public/index.html'
  end
end
application_controller.rb
class ApplicationController < ActionController::API
end

routes.rb は以下で検証した。

  • match '*all', to: 'static_pages#index', via: [:get]
  • root 'static_pages#index'
  • get '/index', to: 'static_pages#index'

(寄り道)fileをつけなくても良いパターン

ルートで紐付けたcontroller#actionだとfileキーを付けなくてもいける。
html1枚だけ配信したいケースならこれで事足りる。

routes.rb
root 'static_pages#index'
StaticPagesController.rb
class StaticPagesController < ActionController
  def index
    render 'public/index.html'
  end
end

(注) render file:renderだけにしている。

パス指定すると、renderだけだとviews配下を見にいくので、ActionView::MissingTemplateが発生する。

routes.rb
  get  '/index', to: 'static_pages#index'
StaticPagesController.rb
同上

結果

Missing template public/index.html 
with {:locale=>[:ja], :formats=>[:html], :variants=>[], 
:handlers=>[:raw, :erb, :html, :builder, :ruby, :jbuilder]}. 
Searched in: * "(...)/app/views"

SPAが動いていない時のケア

不幸にもSPAが管理しているURLなのに、ブラウザが拾ってサーバにGETリクエストを飛ばしてしまうケースは発生する。

  • ブラウザのアドレスバーに直接入力した
  • ユーザーがブラウザのキャッシュをクリアした
  • 特定のURLをいつものwebサービスのようにブクマするなりシェアした

SSR(ServerSideRedering)をしていればまた話は変わるが、そうでなければ以下のようにケアしておく。途中に置くと以降のルートに流れなくなるので、末尾に記載する。

routes.rb
  get '*path', to: redirect('/')

(追記)SPAのURLのままシェアする方法を別記事でまとめました。

他のhtmlファイル

サイト紹介のためのabout/contactらも同じように配信できる。

routes.rb
  get  '/about', to: 'static_pages#about'
  get  '/contact', to: 'static_pages#contact'

他のJSファイルやCSSファイル

  • ルート直下にpublic/assetsフォルダを用意するなり。
  • フロントでビルドする
  • ビルドしたファイルをコピーする

参考

How to render file in Rails 5 API?