すごい広島 #16 で遊んだこと
Rails で AbstractContrller::Base を継承して オレオレ コントローラ を作りたいと思います。
どうしてこれをしたいかというと View です。 コントローラ名とアクションに対応した View がレンダリングできるのが魅力的です。
状況としてはメールを送るわけではないので ActionMailer 使えないし、すぐに画面に表示するわけではないので ActionController はちょっと…という感じなわけです。 どんな状況かというとDBに保存する長文を作成したい時です。
書いたビューはこんな感じ。
こんにちは <%= @user %>さん
<%= goodbye_helper @user %>
ヘルパーも使えるようにしてみます。
ファイル名は app/views/hoge_template/goro.text.erb
でコントローラ名が hoge_template
アクション名 goro
テンプレートエンジンは erb
です。
利用には以下のように使います。
rails c
の中でやったり、モデルの中で使えます。
もちろんコントローラ上でも。
template = HogeTemplate.new
template.process(:goro)
template.render
renderの戻り値がテンプレートの出力結果になります。
最終的な出力目標は
こんにちは おなまえさん
おなまえさん、おやすみ
を目指します。
@uesr
には おなまえ
が入っています。
goobye_helper
はお別れのあいさつをしてくれるように実装します。
作成するコントローラ的な役割をする HogeTemplate はこのように書きたいはずです。
class HogeTemplate < ActionTemplate
def goro
@user = "おなまえ"
end
end
Helper は以下のように書きたいです。
module ApplicationHelper
def goodbye_helper(user)
"#{user}さん、おやすみ"
end
end
このようにできる ActionTemplate クラスを作るのが目的です。
その ActienTemplate クラスは下記で動作させることができました。
class ActionTemplate < AbstractController::Base
include AbstractController::Rendering
include ActionController::Helpers
helpers_path << 'app/helpers'
helper :all
view_paths << 'app/views'
end
helpers_path
や view_paths
で読み込み場所を調整できます。
これはうまくやれば省略できそうなのですがそこまでまだいけていません。
ActionTemplate
を app/models
に保存していますが、これは説明用です。
専用のディレクトリを作成して autoload_path へ追加したいですが、複雑になるので省略しました。
使い道があるかどうかわかりませんが、試したので整理してみました。