静的コンテンツを表示してみる

Rails で静的コンテンツを置く場所は RAILS_ROOT/public 以下が一般的です。ですが、レイアウトは共有したいとか、そもそも公開された場所に置きたくないという場合は少し工夫する必要があります。

今回は html を任意に呼び出して表示するサンプルを載せてみます。静的なファイルは RAILS_ROOT/pages ディレクトリ以下に『名前.html』の形式で配置されているものとします。

実装

まずはコントローラを作成します。名前は pages_controller にします。

class PagesController < ApplicationController
  # レイアウト指定 application.html.erb を使うなら不要
  layout 'some_layout'

  def show
    if params[:page] && File.exists?(path = "#{RAILS_ROOT}/pages/#{params[:page]}.html")
      render :file => path, :layout => true
    else
      render :text => "Page does not exists.", :status => 404
    end
  end
end

上記 show メソッドは params[:page] としてファイル名を受け取り、指定のファイルが存在するならそれをそのままレイアウトつきでレンダリングします。

ビュー側は普通にリンクを呼び出すだけで完了。下の例では test.html を呼び出します。

<%= link_to 'Test', :controller => 'pages', :action => 'show', :page => 'test' %>

これだけではリンクアドレスが serveraddr/pages/show/?page=test のような形になってしまうので、ルーティングも変更します。
他の独自ルーティングの後ろに、ルーティングを定義しましょう。

map.connect "/:page",
            :controller => 'pages',
            :action => 'show'

これで serveraddr/test という形でアクセスが可能になりました。

ちなみにこれ、静的と言いながら Rails の render を利用しているので erb のようにコードも埋め込めます。たとえば、先ほどの test.html にこんなコードを埋め込んでみます。

&copy; <%= Time.now.year %> hogehoge all rights reserved.

めんどくさがりな人も、これでいつでも権利表示が現在の表記に。ファイルの拡張子は関係しませんが、几帳面な方は erb あたりにしとくといいかもしれません。