Posted filed under Ruby on Rails.

別にPHPの話題とは関係ないのですが、PHP見たいにHTMLにぺっとコードを貼って動かしたいなーというケースはRailsでアプリを組んでいて思う事が多々あります。

ヘルプページは静的なHTMLなんだけど、レイアウトはRails部分と共用したいなーとか、ヘッダ部分にログイン中のユーザ名だけは入れておきたいなーとか。

そこで、そんなときのため、http://example.com/helpにアクセスすると、RAILS_ROOT/erb/help.html.erbが実行されるような仕組みを考えてみました。めんどくさいのでプラグインにはしていません。

ルートファイルと、アプリケーションコントローラに下記のコードを追加してください。

config/routes.rbの最後の行に追加

   map.connect '*path', :controller => 'application', :action => 'rescue_404' if ::ActionController::Base.consider_all_requests_local

app/controllers/application.rbの適当な所に追加

  def rescue_404
    absolute_root = File.join(File.expand_path(RAILS_ROOT),'')
    template = File.expand_path(File.join('erb', *params[:path]), RAILS_ROOT)
    if template.index(absolute_root) == 0
      template = File.join(template, 'index') if File.directory?(template)
      ['.html.erb', '.erb', '.rhtml'].each do |ext|
        return render(:file => template+ext) if File.file?(template+ext)
      end
    end
    render :file => File.join(RAILS_ROOT, 'public', '404.html')
  end

これで、RAILS_ROOT/erbディレクトリを作り、そこにerbファイルを置くと直接実行することができるようになります。
ApplicationControllerから呼ばれて実行されるので、アプリによってはログイン中のユーザ情報なども取得する事ができると思います。

p.s
前回のCookieSessionのjpmobile対応はあきらめました。色々ややこしいことが分かってきたので。。。

4 Responses to “Railsでコントローラを作らずにerbだけ実行する方法”

  1. ななし

    ややこしい中でも、最大の所、または最大にムカついた所を是非教えて下さい。
    自分の至ら無さとか、はぐらかしは無しで(笑)

  2. masuidrive

    URLを生成したあとに、sessionの中身を変更したときにそれが反映できない事が最大の原因でした。
    filterを使って出来ない事もないけど、それならmod_chxjみたいなものでcookieをエミュレーションしたほうが良さそうだなと思ったので、やめました。

  3. trooper

    古いエントリですみません。
    jpmobileとは関係ないのですが、FLASHからデータPOSTする際にうまくCookie効いてくれないんで、
    パラメータでCookieStoreの値を送るコードを書いたんですね。
    で、masuiさんが指摘している「URLを生成したあとに、sessionの中身を変更したときにそれが反映できない」も
    そうなんでしょうけど、そもそもCookieStoreの場合、Cookie以外の方法でRailsに送っても、正常に認識してくれないっぽいです。。
    これそういう仕様なんでしょうかね??CookieStoreっていうだけあって。。泣

    うーん、FLASH使ってsession維持するの難しそうだな。。

  4. trooper

    あ、なんか全エントリ読んだら完全に勘違いしていたことに気付きました。。
    そもそも、CSRF対策をハックしないといけないんですね。。。
    ちょっと希望がもてました!