ヘルパーメソッド
テンプレートヘルパはよくある HTML の作業を簡単にするため, 動的テンプレートの中で 使用できるメソッドです。基本的なメソッドのほとんどは Rails のビューヘルパを利用 したことのある人にはお馴染みのものです。これらのヘルパは Padrino フレームワーク によって組み込まれています。完全なドキュメントはこちら。
リンクヘルパ
Padrino はリンクタグを作るための link_to
メソッドを提供します。
基本的な使い方では link_to
が引数にリンク名とリンク URL を取ります:
<%= link_to '私のサイト', 'http://mysite.com' %>
link_to
はより複雑な内容のリンクを生成できるように, ブロックをとることも
できます:
<% link_to 'http://mysite.com' do %>
<%= image_tag 'mylogo.png' %>
<% end %>
Middleman は link_to
に サイトマップ を把握させることでより強力に
します。source フォルダ (ファイル拡張子からテンプレート言語拡張子を除いた状態で)
のページへの参照を与えると,link_to
は きれいな URL 拡張が
有効化されていたとしても, 正しいリンクを生成します。例えば, source/about.html
ファイルがあり :directory_indexes
が有効化されている場合, 次のように
リンクします:
<%= link_to 'About', '/about.html' %>
結果:
<a href='/about/'>About</a>
現在ページから相対パスで参照することもできます。リンクを現在ページからの
相対パスにしたいと考える人もいるでしょう。:relative => true
を渡すことで,
link_to
は相対 URL になります。
:directory_indexes
を有効状態で, source/foo/index.html.erb からパスを得る場合:
<%= link_to 'About', '/about.html', :relative => true %>
結果:
<a href="../about/">About</a>
link_to
で作られるあらゆる URL を相対パスにしたい場合,
config.rb
に次を追加します:
set :relative_links, true
相対パスにしたくないリンクに :relative => false
を追加することで個別に
上書きすることもできます。
link_to
ヘルパが与えられた URL の属するページの決定に失敗した場合,
指定された URL を変更せず使います。この場合 :relative_links
オプションは
無視されますが, :relative => true
を指定している場合はエラーが
発生します。
[サイトマップ][sitema] リソースの url
メソッド
(Blog 機能 の BlogArticle に継承される) は 出力 URL を返すことに
注意してください。link_to
ヘルパは対応する page/article の ソースパス
に一致させることができず, 相対 URL に変換できない場合があります。
link_to
に出力 URL を与える代わりに, link_to
の URL 引数として
Resource/Blogarticle の path
属性 を介した ソースパス を
与えるか, 単にリソース自体のパスを与えます。どちらの方法も link_to
に
相対 URL を生成させます:
<ul>
<% blog.articles.each do |article| %>
<li>
<%= link_to article.title, article.path, :relative => true %>
<%# 第 2 引数の `article.path` に注目 %>
</li>
<% end %>
</ul>
<ul>
<% sitemap.resources.select{|resource| resource.data.title}.each do |resource| %>
<li>
<%= link_to resource.data.title, resource, :relative => true %>
<%# 第 2 引数の `resource` に注目 %>
</li>
<% end %>
</ul>
リンクのクエリパラメータや URL フラグメントを次のように含めることができます:
<%= link_to '私のフォーム', '/form.html', :query => { :foo => 'bar' }, :fragment => 'deep' %>
結果:
<a href="/form.html?foo=bar#deep">私のフォーム</a>
リンクタグなしのページ URL が必要な場合, url_for
を使ってください。
これは link_to
や form_tag
の処理の中でも使われています。
出力ヘルパ
出力ヘルパは様々な方法で出力を管理, キャプチャ, 表示する重要なメソッドの集合で,
より高いレベルのヘルパ機能をサポートするために使われます。
説明すべき出力ヘルパが 3 つあります:
content_for
, capture_html
や concat_content
。
content_for
はコンテンツのキャプチャを行い, レイアウトの中など異なった場所での
レンダリングをサポートします。その 1 つの例はテンプレートからレイアウトに
assets を含めるものです:
<% content_for :assets do %>
<%= stylesheet_link_tag 'index', 'custom' %>
<% end %>
テンプレートに追加することで, ブロックに含まれる部分をキャプチャしレイアウトで yield を用いて出力します:
<head>
<title>例</title>
<%= stylesheet_link_tag 'style' %>
<%= yield_content :assets %>
</head>
自動的にブロックの内容 (この場合はスタイルシートが含まれる) を レイアウト内で yield された場所に挿入します。
content_for?
にキーを与えることで content_for
ブロックが存在するか
確認することもできます:
<% if content_for?(:assets) %>
<div><%= yield_content :assets %></div>
<% end %>
ブロック引数にも対応します。
yield_content :head, param1, param2
content_for(:head) { |param1, param2| ...content... }
タグヘルパ
タグヘルパはビューテンプレート内の HTML "タグ" を生成するために使われる
基本的なメソッドです。このカテゴリには 3 つの主要メソッドがあります: tag
,
content_tag
と input_tag
。
tag
と content_tag
はタグ名と指定されたオプションで任意の HTML タグを
生成します。 HTML タグが "中身" を含む場合, content_tag
が
使われます。例:
<%= tag :img, :src => "/my_image.png" %>
# => <img src='/my_image.png'>
<% content_tag :p, :class => "stuff" do %>
こんにちわ
<% end %>
# => <p class='stuff'>こんにちわ</p>
input_tag
はユーザからの入力を受け付けるタグを生成するために
使われます:
input_tag :text, :class => "demo"
# => <input type='text' class='demo'>
input_tag :password, :value => "secret", :class => "demo"
# => <input type='password' value='secret' class='demo'>
アセットヘルパ
アセットヘルパはハイパーリンク, mail_to リンク, 画像, スタイルシートや JavaScript のような html をビューテンプレートに挿入する手助けをします。 簡単なビューテンプレートでの使用方法は次のようになります:
<html>
<head>
<%= stylesheet_link_tag 'layout' %>
<%= javascript_include_tag 'application' %>
<%= favicon_tag 'images/favicon.png' %>
</head>
<body>
<p><%= link_to 'Blog', '/blog', :class => 'example' %></p>
<p>Mail me at <%= mail_to 'fake@faker.com', "Fake Email Link", :cc => "test@demo.com" %></p>
<p><%= image_tag 'padrino.png', :width => '35', :class => 'logo' %></p>
</body>
</html>
auto_stylesheet_link_tag
や auto_javascript_include_tag
は
現在ページのパスを元にスタイルシートや JavaScript のタグを生成します。
ページが contact.html
の場合, contact.css
や contact.js
の参照になります。
Form ヘルパ
Form ヘルパは form を作る際に使うであろう "一般的な" form タグのヘルパです。 非オブジェクトの form が作られる場合の簡単な例は次のように:
<% form_tag '/destroy', :class => 'destroy-form', :method => 'delete' do %>
<% field_set_tag do %>
<p>
<%= label_tag :username, :class => 'first' %>
<%= text_field_tag :username, :value => params[:username] %>
</p>
<p>
<%= label_tag :password, :class => 'first' %>
<%= password_field_tag :password, :value => params[:password] %>
</p>
<p>
<%= label_tag :strategy %>
<%= select_tag :strategy, :options => ['delete', 'destroy'],
:selected => 'delete' %>
</p>
<p>
<%= check_box_tag :confirm_delete %>
</p>
<% end %>
<% field_set_tag(:class => 'buttons') do %>
<%= submit_tag "削除" %>
<% end %>
<% end %>
フォーマットヘルパ
フォーマットヘルパはテキストを目的に合わせて加工するための便利な
メソッドです。フォーマットヘルパの代表的なものは escape_html
,
distance_of_time_in_words
, time_ago_in_words
と js_escape_html
の 4 つです。
escape_html
と js_escape_html
メソッドは html 文字列を
取得し, 特定の文字をエスケープするものです。escape_html
は
HTML/XML のアンパサンド, 括弧や引用符をエスケープします。テンプレートに
表示する前にユーザコンテンツをエスケープするのに便利です。 js_escape_html
は
JS テンプレートから JavaScript の関数に情報を与える場合に
使用されます。
escape_html('<hello>&<goodbye>') # => <hello>&<goodbye>
テンプレート内で簡単に使うために h
という escape_html
のエイリアスも
あります。
フォーマットヘルパは simple_format
, pluralize
, word_wrap
や truncate
のようなテキストの加工に便利な機能も含みます。
simple_format("hello\nworld")
# => "<p>hello<br/>world</p>"
pluralize(2, '人')
# => '2 人'
word_wrap('Once upon a time', :line_width => 8)
# => "Once upon\na time"
truncate("Once upon a time in a world far far away", :length => 8)
# => "Once upon..."
truncate_words("Once upon a time in a world far far away", :length => 4)
# => "Once upon a time..."
highlight('Lorem dolor sit', 'dolor')
# => "Lorem <strong class="highlight">dolor</strong> sit"
ダミーテキスト & Placehold.it ヘルパ
Sinatra の影響も受けた静的ツール Frank プロジェクト は, ランダム なテキストコンテンツとプレースホルダ画像を生成する素晴らしいヘルパセットです。 私たちはこのコードを Middleman に適合させました (MIT ライセンスを歓迎します)。
例えば, ダミーテキストを 5 文出力したい場合, 次のように 書けます。
<%= lorem.sentences 5 %>
その他のメソッドについてもテキストに関して利用できます:
lorem.sentence # 1 文を返す
lorem.words 5 # 5 つの単語を返す
lorem.word
lorem.paragraphs 10 # 10 段落を返す
lorem.paragraph
lorem.date # strftime 形式の引数を受取る
lorem.name
lorem.first_name
lorem.last_name
lorem.email
プレースホルダ画像の使用方法:
lorem.image('300x400')
#=> http://placehold.it/300x400
lorem.image('300x400', :background_color => '333', :color => 'fff')
#=> http://placehold.it/300x400/333/fff
lorem.image('300x400', :random_color => true)
#=> http://placehold.it/300x400/f47av7/9fbc34d
lorem.image('300x400', :text => 'blah')
#=> http://placehold.it/300x400&text=blah
ページクラス
サイト階層に対応する body
タグの class 属性が生成されると便利です。
page_classes
はこれらの属性名を生成します。projects/rockets/saturn-v.html
にページがあるとすると, レイアウトには次のように表示されます:
<body class="<%= page_classes %>">
結果:
<body class="projects rockets saturn-v">
これにより簡単にページに project-specific や rocket-specific のスタイルを 適用できます。
環境モードヘルパ
Middleman は build?
と development?
の 2 つのヘルパを用意しています。これらの
ヘルパは特定の環境モードで動作させるコードのために使われます。例の 1 つとして
Google Analytics のトラッキングコードが挙げられます。イベントを
ローカルホストの Web サイトからは送信せず, プロダクションビルドでのみ
送信したい場合です。
<% if build? %>
<%= partial "tracking_snippet" %>
<% end %>
カスタム定義ヘルパ
Middleman によって提供されるヘルパに加え, コントローラやビューの中からアクセスできる 独自のヘルパやクラスを追加することができます。
ヘルパメソッドを定義するには, config.rb
の中で helpers
ブロックを使います:
helpers do
def some_method
# ...何らかの処理を追加...
end
end
また, ヘルパメソッドを含む外部モジュールを定義することができます。
モジュール名に基づいたファイル名で helpers
ディレクトリに配置
(例えば CustomHelpers
の場合には helpers/custom_helpers.rb
)することで
Middleman は自動的にファイルを読み込み, ヘルパとして利用可能にします。
例えば, ヘルパを helpers/custom_helpers.rb
に抽出する場合,
次のようにモジュールを定義することができます:
module CustomHelpers
def some_method
# ...何らかの処理を追加...
end
end
抽出したモジュールをディレクトリ構造の中で別の場所に配置することもできます。
例えば lib
ディレクトリです。しかし, この場合は config.rb
の中で
手動でファイルを読み込みヘルパとして利用可能にする必要があります:
require "lib/custom_helpers"
helpers CustomHelpers