HTML Imports用のヘルパー
Padrinoで、HTML ImportsでHTMLファイルを読み込む時用にヘルパーを定義すると、こんな感じになると思います。
My::App.helpers do
def html_import_tag(*sources)
options = {
rel: 'import'
}.update(sources.extract_options!.symbolize_keys)
sources.flatten.inject(ActiveSupport::SafeBuffer.new) do |all, source|
all << tag(:link, {href: asset_path(:html, source)}.update(options))
end
end
end
で、ビューの方でこういうふうにしてlink
タグを生成します。
<%= html_import_tag 'elements' %>
これだと
<link href="/html/elements" rel="import" />
という風に出力されてしまって、二点、意図に反することがあります。
- パスの最初の部分が
html
になっている。elements
にしたい(ここではそういうことにしてください) - 拡張子がない
アセットフォルダーを設定する
Padrinoではアセット用のフォルダーとして、デフォルトでは
- CSSファイル -> "stylesheets"
- JavaScriptファイル -> "javascripts"
が定義されていて、stylesheet_link_tag
とかでlink
タグを出力する場合はこのフォルダー名が使われます。そしてこれ以外のアセット(画像とか)は、(内部実装の話になりますが)asset_path
に渡す第一引数がそのまま使われます。例えば画像のパスを出力するimage_path
メソッドは
def image_path(src)
asset_path(:images, src)
end
という実装になっているため、第一引数(:images
)が使われて「images」というフォルダー名になります。HTML用ヘルパーではasset_path(:html, ...)
としているので、フォルダー名が「html」となってしまうわけです。
これをカスタマイズするにはconfig/apps.rbなどで設定します。
Padrino.configure_apps do
# ...
set :html_asset_folder, 'elements'
# ...
end
:html_asset_folder
の最初の「html」の部分を認識して、asset_path
の第一引数と対応付けてくれます。これで、
<%= html_import_tag 'elements' %>
の出力が
<link href="/elements/elements" rel="import" />
となり、フォルダー名の部分は解決できます。
拡張子を設定する
次に拡張子として「.html」を設定します。
現状、Padrino::Helpers::AssetTagHelpers::APPEND_ASSET_EXTENSIONS
という定数を弄るしか無いように見えます。これは配列になっていて、ここに入っているタイプは拡張子が付与され、それ以外は拡張子無しのURIになります。デフォルトではcss
とjs
が入っているので、asset_path(:css, ...)
とやると拡張子「.css」が付与されるわけです。
というわけなので、どこか適当な所で
Padrino::Helpers::AssetTagHelpers::APPEND_ASSET_EXTENSIONS << 'html'
とすることで、HTMLファイルにも自動的に拡張子を付けることができます。
<%= html_import_tag 'elements' %>
↓
<link href="/elements/elements.html" rel="import" />
めでたしめでたし。