2013 9月4日 19:03
すごい広島 #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
2012 11月22日 10:35
Railsのhelperに TagHelper っていうのが text_area_tag のようなフォームを作成するような Helper がありますが、その内部で使用するようなメソッドが定義されています。 主に tag, content_tag になるのですが、自分でHTMLのタグを生成するようなヘルパーを生成したときこれを使うと便利です。 例えば hoge的なものを表現するタグを生成するhoge_tagという抽象化をしたいときにざっくりな実装をすると以下のようになります。 def hoge_tag(content) %Q{<div class="hoge">#{content}</div>}.html_safe end hoge_tag "hogehoge" # => "<div class=\"hoge goro\">hogehoge</div>" しかし、つかっていくと個別に class属性を追加したくなる場合が多々ありますし、content の escape などもしないといけないです。 def hoge_tag(content, *classes) classes = ["hoge"] + classes class_string = classes.join(" ") %Q{<div class="#{class_string}">#{content}</div>}.html_safe end hoge_tag "hogehoge", "goro" # => "<div class=\"hoge goro\">hogehoge</div>" もちろん、class属性だけじゃなくていろいろ指定したくなります。 text_area_tag なんかと同じようにoptionsで受けるようにしたい。こうなっとときに 「ソースを読もう!!」 という発想が出るようになると良いと思います。 def hoge_tag(content, options = nil) classes = options[:class] classes = [classes] unless