LoginSignup
3
4

More than 5 years have passed since last update.

PadrinoでHTML Imports用のヘルパーを設定する

Posted at

HTML Imports用のヘルパー

Padrinoで、HTML ImportsでHTMLファイルを読み込む時用にヘルパーを定義すると、こんな感じになると思います。

asset_tag_helper.rb
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タグを生成します。

application.html.erb
<%= 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などで設定します。

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になります。デフォルトではcssjsが入っているので、asset_path(:css, ...)とやると拡張子「.css」が付与されるわけです。

というわけなので、どこか適当な所で

Padrino::Helpers::AssetTagHelpers::APPEND_ASSET_EXTENSIONS << 'html'

とすることで、HTMLファイルにも自動的に拡張子を付けることができます。

<%= html_import_tag 'elements' %>

    ↓

<link href="/elements/elements.html" rel="import" />

めでたしめでたし。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4