Action View ヘルパー

このガイドの内容:

  • 日付、文字列、数値のフォーマット方法
  • テキストやタグの処理方法
  • 画像、動画、スタイルシートなどへのリンク方法
  • Atomフィードの生成方法やビューでのJavaScriptの利用方法
  • キャッシュ、キャプチャ、デバッグ、コンテンツのサニタイズ方法

本ガイドでは、Action Viewで利用できるヘルパーのうち、最もよく使われるヘルパーの一部の概要を解説するにとどめています。本ガイドはヘルパー入門として提供されていますが、すべてのヘルパーについて詳しい説明が網羅されているAPIドキュメントも参照するのがオススメです。

1 フォーマット用ヘルパー

1.1 日付・時刻ヘルパー

これらのヘルパーは、日付や時刻の要素をコンテキストに応じて人間が読み取り可能な形式として表示するのに役立ちます。

1.1.1 distance_of_time_in_words

2つの「Timeオブジェクト」「Dateオブジェクト」「整数(秒)」同士のおおよそのインターバル(日時と日時の間隔)を英文で出力します。単位を詳細にしたい場合はinclude_seconds: trueを設定します。

distance_of_time_in_words(Time.current, 15.seconds.from_now)
# => less than a minute
distance_of_time_in_words(Time.current, 15.seconds.from_now, include_seconds: true)
# => less than 20 seconds

上のサンプルコードでTime.nowではなくTime.currentを使っている点にご注意ください。Time.currentはRailsアプリケーションに設定されているタイムゾーンに基づいた現在時刻を返しますが、Time.nowは(Railsアプリケーションではなく)サーバーのタイムゾーンに基づいた現在時刻を返します。

詳しくはdistance_of_time_in_wordsAPIドキュメントを参照してください。

1.1.2 time_ago_in_words

Timeオブジェクト」「Dateオブジェクト」または「整数(秒)」と、Time.currentの間のおおよそのインターバル(日時と日時の間隔)を英文で出力します。

time_ago_in_words(3.minutes.from_now) # => 3 minutes

詳しくはtime_ago_in_words APIドキュメントを参照してください。

1.2 数値ヘルパー

数値を書式付き文字列に変換するさまざまなメソッドを提供します。「電話番号」「通貨」「パーセント」「精度」「桁区切り記号」「ファイルサイズ」用のメソッドが提供されます。

1.2.1 number_to_currency

数値を通貨表示の文字列にフォーマットします($13.65など)。

number_to_currency(1234567890.50) # => $1,234,567,890.50

詳しくはnumber_to_currency APIドキュメントを参照してください。

1.2.2 number_to_human

数値を、人間が読みやすい形式(数詞を追加)で近似表示します。数値が非常に大きくなる可能性がある場合に便利です。

number_to_human(1234)    # => 1.23 Thousand
number_to_human(1234567) # => 1.23 Million

詳しくはnumber_to_human APIドキュメントを参照してください。

1.2.3 number_to_human_size

バイト単位の数値を、KBやMBなどのわかりやすい単位でフォーマットします。ファイルサイズを表示する場合に便利です。

number_to_human_size(1234)    # => 1.21 KB
number_to_human_size(1234567) # => 1.18 MB

詳しくはnumber_to_human_size APIドキュメントを参照してください。

1.2.4 number_to_percentage

数値をパーセント形式の文字列にフォーマットします。

number_to_percentage(100, precision: 0) # => 100%

詳しくはnumber_to_percentage APIドキュメントを参照してください。

1.2.5 number_to_phone

数値を電話番号形式にフォーマットします(デフォルトは米国の電話番号形式)。

number_to_phone(1235551234) # => 123-555-1234

詳しくはnumber_to_phone APIドキュメントを参照してください。

1.2.6 number_with_delimiter

数値を区切り文字で3桁ずつグループ化します。

number_with_delimiter(12345678) # => 12,345,678

詳しくはnumber_with_delimiter APIドキュメントを参照してください。

1.2.7 number_with_precision

数値の小数点以下の精度(表示を丸める位置)をprecisionで指定できます(デフォルトは3)。

number_with_precision(111.2345)               # => 111.235
number_with_precision(111.2345, precision: 2) # => 111.23

詳しくはnumber_with_precision APIドキュメントを参照してください。

1.3 テキストヘルパー

文字列のフィルタリング、フォーマット、変換を行うメソッドを提供します。

1.3.1 excerpt

excerptヘルパーにtext(第1引数)とphrase(第2引数)を渡すと、phraseで指定したものが最初に出現する位置を中心に、前後のテキストをradiusオプションで指定した単語の数だけtextから抜粋します。抽出したテキストの冒頭や末尾がtextの冒頭や末尾と異なる場合は、省略記号...が追加されます。

excerpt("This is a very beautiful morning", "very", separator: " ", radius: 1)
# => ...a very beautiful...

excerpt("This is also an example", "an", radius: 8, omission: "<chop> ")
#=> <chop> is also an example

詳しくはexcerpt APIドキュメントを参照してください。

1.3.2 pluralize

英単語の単数形または複数形を、指定の数値に応じて返します。

pluralize(1, "person") # => 1 person
pluralize(2, "person") # => 2 people
pluralize(3, "person", plural: "users") # => 3 users

詳しくはpluralize APIドキュメントを参照してください。

1.3.3 truncate

text(第1引数)に渡したテキストを、lengthオプションで指定した長さに切り詰めます。テキストが切り詰められた場合は、lengthオプションで指定した長さを超えないように省略記号...が追加されます。

truncate("Once upon a time in a world far far away")
# => "Once upon a time in a world..."

truncate("Once upon a time in a world far far away", length: 17)
# => "Once upon a ti..."

truncate("one-two-three-four-five", length: 20, separator: "-")
# => "one-two-three..."

truncate("And they found that many people were sleeping better.", length: 25, omission: "... (continued)")
# => "And they f... (continued)"

truncate("<p>Once upon a time in a world far far away</p>", escape: false)
# => "<p>Once upon a time in a wo..."

詳しくはtruncate APIドキュメントを参照してください。

1.3.4 word_wrap

line_widthオプションで指定した幅に収まるようにテキストを改行します。

word_wrap("Once upon a time", line_width: 8)
# => "Once\nupon a\ntime"

詳しくはword_wrap APIドキュメントを参照してください。

2 フォームヘルパー

フォームヘルパーを利用すると、HTML要素だけでフォームを作成するよりもモデルの扱いがシンプルになります。フォームヘルパーは、モデルに基づいたフォーム生成に特化しており、ユーザー入力の種類(テキストフィールド、パスワードフィールド、ドロップダウンボックスなど)に応じたさまざまなメソッドを提供します。フォームが送信されると、フォームへの入力がparamsオブジェクトにまとめられてコントローラに送信されます。

フォームヘルパーについて詳しくは、Action View フォームヘルパーガイドを参照してください。

3 ナビゲーション

ルーティングサブシステムに依存する形でリンクやURLをビルドするための一連のメソッドです。

3.1 button_to

渡されたURLに送信するフォームを生成します。このフォームには、nameの値がボタン名となる送信ボタンが表示されます。

<%= button_to "Sign in", sign_in_path %>

上は以下のようなフォームを生成します。

<form method="post" action="/sessions" class="button_to">
  <input type="submit" value="Sign in" />
</form>

詳しくはbutton_to APIドキュメントを参照してください。

3.2 current_page?

このヘルパーに渡したオプションが現在のリクエストURLと一致する場合はtrueを返します。

<% if current_page?(controller: 'profiles', action: 'show') %>
  <strong>Currently on the profile page</strong>
<% end %>

詳しくはcurrent_page? APIドキュメントを参照してください。

内部でurl_forから導出したURLへのリンクを生成します。link_toは、RESTfulリソースのリンクを作成するために用いるのが一般的で、特にモデルを引数としてlink_toに渡すときに多用されます。

link_to "Profile", @profile
# => <a href="/profiles/1">Profile</a>

link_to "Book", @book # 複合主キー[:author_id, :id]を渡した場合
# => <a href="/books/2_1">Book</a>

link_to "Profiles", profiles_path
# => <a href="/profiles">Profiles</a>

link_to nil, "https://example.com"
# => <a href="https://example.com">https://example.com</a>

link_to "Articles", articles_path, id: "articles", class: "article__container"
# => <a href="/articles" class="article__container" id="articles">Articles</a>

以下のようにブロックを渡すと、リンクの表示名をnameパラメーターと異なるものにできます。

<%= link_to @profile do %>
  <strong><%= @profile.name %></strong> -- <span>Check it out!</span>
<% end %>

上のコードで以下のようなHTMLが出力されます。

<a href="/profiles/1">
  <strong>David</strong> -- <span>Check it out!</span>
</a>

詳しくはlink_to APIドキュメントを参照してください。

3.4 mail_to

指定したメールアドレスへのmailtoリンクタグを生成します。リンクテキスト、追加のHTMLオプション、メールアドレスをエンコードするかどうかも指定できます。

mail_to "john_doe@gmail.com"
# => <a href="mailto:john_doe@gmail.com">john_doe@gmail.com</a>

mail_to "me@john_doe.com", cc: "me@jane_doe.com",
        subject: "This is an example email"
# => <a href="mailto:"me@john_doe.com?cc=me@jane_doe.com&subject=This%20is%20an%20example%20email">"me@john_doe.com</a>

詳しくはmail_to APIドキュメントを参照してください。

3.5 url_for

optionsで渡した一連のオプションに対応するURLを返します。

url_for @profile
# => /profiles/1

url_for [ @hotel, @booking, page: 2, line: 3 ]
# => /hotels/1/bookings/1?line=3&page=2

url_for @post # 複合主キー[:blog_id, :id]を渡した場合
# => /posts/1_2

4 サニタイズヘルパー

望ましくないHTML要素をテキストから除去するための一連のメソッドです。サニタイズヘルパーは、安全で有効なHTML/CSSだけをレンダリングするときに特に有用です。また、サニタイズヘルパーはXSS(クロスサイトスクリプティング)攻撃を防ぐうえでも有用で、ユーザー入力に含まれる可能性のある危険なコンテンツを、ビューで表示する前にエスケープまたは削除します。

サニタイズヘルパーは、内部でrails-html-sanitizer gemを利用しています。

4.1 sanitize

sanitizeヘルパーは、すべてのHTMLタグをエンコードし、許可されていない属性をすべて削除します。

sanitize @article.body

:attributesオプションと:tagsオプションのいずれかを渡すと、オプションで指定した属性またはタグだけが許可されます(つまり除去されません)。それ以外の属性やタグは除去されます。

sanitize @article.body, tags: %w(table tr td), attributes: %w(id class style)

よく使うオプションをデフォルト化するには、アプリケーション設定でオプションをデフォルトに追加します。以下はtable関連のタグを追加した場合の例です。

# config/application.rb
class Application < Rails::Application
  config.action_view.sanitized_allowed_tags = %w(table tr td)
end

詳しくはsanitize APIドキュメントを参照してください。

4.2 sanitize_css

CSSのコードブロックをサニタイズします(特にHTMLコンテンツ内にスタイル属性が含まれている場合)。sanitize_css は、ユーザー入力から生成されたコンテンツや、スタイル属性を含む動的コンテンツを扱う場合に特に役立ちます。

以下のsanitize_cssメソッドは、許可されていないCSSスタイルを削除します。

sanitize_css("background-color: red; color: white; font-size: 16px;")

詳しくはsanitize_css APIドキュメントを参照してください。

テキストに含まれるリンクタグを削除し、リンクテキストだけを残します。

strip_links("<a href='https://rubyonrails.org'>Ruby on Rails</a>")
# => Ruby on Rails

strip_links("emails to <a href='mailto:me@email.com'>me@email.com</a>.")
# => emails to me@email.com.

strip_links("Blog: <a href='http://myblog.com/'>Visit</a>.")
# => Blog: Visit.

詳しくはstrip_links APIドキュメントを参照してください。

4.4 strip_tags

HTMLからすべてのHTMLタグを削除します(コメントも削除されます)。 この機能はrails-html-sanitizer gemによるものです。

strip_tags("Strip <i>these</i> tags!")
# => Strip these tags!

strip_tags("<b>Bold</b> no more! <a href='more.html'>See more</a>")
# => Bold no more! See more

strip_links('<<a href="https://example.org">malformed & link</a>')
# => &lt;malformed &amp; link

詳しくはstrip_tags APIドキュメントを参照してください。

5 アセットヘルパー

アセットヘルパーは、ビューから「画像」「JavaScriptファイル」「スタイルシート(CSS)」「フィード」などのアセットにリンクするHTMLを生成する一連のヘルパーメソッドを提供します。

デフォルトでは、現在のホストのpublic/フォルダにあるアセットにリンクされますが、アプリケーション設定のconfig.asset_hostを設定すれば、アセット専用サーバー上にあるアセットに直接リンクできます(この設定は、通常config/environments/production.rbに記述します)。

たとえば、アセットがassets.example.comというホストに置かれている場合は、以下のように設定します。

config.asset_host = "assets.example.com"

これで、設定に対応するURLがimage_tagで生成されるようになります。

image_tag("rails.png")
# => <img src="//assets.example.com/images/rails.png" />

5.1 audio_tag

単独のソースURL文字列を渡すと単一のsrcタグを含むHTML audioタグを生成し、複数のソースURL文字列を渡すと複数のsrcタグを含むaudioタグを生成します。sourcesオプションには、フルパス、公開しているオーディオディレクトリ内のファイル、またはActive Storage の添付ファイルを指定できます。

audio_tag("sound")
# => <audio src="/audios/sound"></audio>

audio_tag("sound.wav", "sound.mid")
# => <audio><source src="/audios/sound.wav" /><source src="/audios/sound.mid" /></audio>

audio_tag("sound", controls: true)
# => <audio controls="controls" src="/audios/sound"></audio>

audio_tagの内部では、AssetUrlHelperaudio_pathを用いてオーディオファイルへのパスをビルドしています。

詳しくはaudio_tag APIドキュメントを参照してください。

ブラウザやRSSフィードリーダーが「RSS」「Atom」または「JSON」フィードを自動検出するときに利用可能なリンクタグを返します。

auto_discovery_link_tag(:rss, "http://www.example.com/feed.rss", { title: "RSS Feed" })
# => <link rel="alternate" type="application/rss+xml" title="RSS Feed" href="http://www.example.com/feed.rss" />

詳しくはauto_discovery_link_tag APIドキュメントを参照してください。

アセットパイプラインによって管理されるファビコンのリンクタグを返します。sourceには、フルパス、またはアセットディレクトリに存在するファイルを指定できます。

favicon_link_tag
# => <link href="/assets/favicon.ico" rel="icon" type="image/x-icon" />

詳しくはfavicon_link_tag APIドキュメントを参照してください。

5.4 image_tag

指定されたソースに対応するHTMLのimgタグを返します。ソースには、フルパス、またはアプリのapp/assets/imagesディレクトリの下に存在するファイルを指定できます。

image_tag("icon.png")
# => <img src="/assets/icon.png" />

image_tag("icon.png", size: "16x10", alt: "Edit Article")
# => <img src="/assets/icon.png" width="16" height="10" alt="Edit Article" />

image_tagの内部では、AssetUrlHelperimage_pathを用いて画像ファイルへのパスをビルドしています。

詳しくはimage_tag APIドキュメントを参照してください。

5.5 javascript_include_tag

指定されたソースごとにHTMLのscriptタグを返します。app/assets/javascriptsディレクトリの下に存在するJavaScriptファイル名(拡張子.jsはオプションなので指定しなくてもよい)を渡すことも、ドキュメントルートからの相対的な完全パスを渡すことも可能です。

javascript_include_tag("common")
# => <script src="/assets/common.js"></script>

javascript_include_tag("common", async: true)
# => <script src="/assets/common.js" async="async"></script>

asyncdeferなどがオプションとしてよく指定されます。async: trueを指定すると、ドキュメントと並行してスクリプトファイルを読み込むことでスクリプトをできるだけ早い段階で解析して評価します。defer: trueを指定すると、ドキュメントの解析後にスクリプトを実行するようブラウザに指示します。

javascript_include_tagの内部では、AssetUrlHelperjavascript_pathを用いてスクリプトファイルへのパスをビルドしています。

詳しくはjavascript_include_tag APIドキュメントを参照してください。

5.6 picture_tag

ソースに対応するHTMLの<picture>タグを返します。String、Array、またはブロックを渡せます。

picture_tag("icon.webp", "icon.png")

上のコードは以下のHTMLを生成します。

<picture>
  <source srcset="/assets/icon.webp" type="image/webp" />
  <source srcset="/assets/icon.png" type="image/png" />
  <img src="/assets/icon.png" />
</picture>

詳しくはpicture_tag APIドキュメントを参照してください。

ブラウザでソースをプリロードさせるのに利用できるHTML linkタグを返します。指定できるソースは、アセットパイプラインによって管理されるリソースパス、フルパス、またはURIです。

preload_link_tag("application.css")
# => <link rel="preload" href="/assets/application.css" as="style" type="text/css" />

詳しくはpreload_link_tag APIドキュメントを参照してください。

引数で指定したソースに対応するスタイルシート用リンクタグを返します。拡張子が指定されていない場合は、自動的に.cssが追加されます。

stylesheet_link_tag("application")
# => <link href="/assets/application.css" rel="stylesheet" />

stylesheet_link_tag("application", media: "all")
# => <link href="/assets/application.css" media="all" rel="stylesheet" />

mediaオプションは、リンクのメディアタイプを指定するのに使われます。最もよく使われるメディアタイプはallscreenprintspeechです。

stylesheet_link_tagの内部では、AssetUrlHelperstylesheet_pathを用いてスタイルシートへのパスをビルドしています。

詳しくはstylesheet_link_tag APIドキュメントを参照してください。

5.9 video_tag

単独のソースURL文字列を渡すと単一のsrcタグを含むHTML videoタグを生成し、複数のソースURL文字列を渡すと複数のsrcタグを含むvideoタグを生成します。sourcesオプションには、フルパス、公開している動画ディレクトリ内のファイル、またはActive Storage の添付ファイルを指定できます。

video_tag("trailer")
# => <video src="/videos/trailer"></video>

video_tag(["trailer.ogg", "trailer.flv"])
# => <video><source src="/videos/trailer.ogg" /><source src="/videos/trailer.flv" /></video>

video_tag("trailer", controls: true)
# => <video controls="controls" src="/videos/trailer"></video>

video_tagの内部では、AssetUrlHelpervideo_pathを用いて動画ファイルへのパスをビルドしています。

詳しくはvideo_tag APIドキュメントを参照してください。

6 JavaScriptヘルパー

ビューでJavaScriptを利用するための機能を提供する一連のヘルパーメソッドです。

6.1 escape_javascript

JavaScriptセグメントでキャリッジリターンや一重引用符や二重引用符をエスケープします。ブラウザが解析するときに無効な文字が含まれないようにしたいときは、このヘルパーメソッドにテキストの文字列を渡します。

たとえば、二重引用符が挨拶文に含まれている以下のようなパーシャルをJavaScriptのアラートボックスで表示したい場合は、以下のように書くことで二重引用符をエスケープできます。

<%# app/views/users/greeting.html.erb %>
My name is <%= current_user.name %>, and I'm here to say "Welcome to our website!"
<script>
  var greeting = "<%= escape_javascript render('users/greeting') %>";
  alert(`Hello, ${greeting}`);
</script>

これで、二重引用符が正しくエスケープされ、アラートボックスに挨拶文が表示されます。

詳しくはescape_javascript APIドキュメントを参照してください。

6.2 javascript_tag

渡されたコードをJavaScriptタグでラップして返します。オプションをハッシュ形式で渡すことで、<script>タグの振る舞いを制御できます。

javascript_tag("alert('All is good')", type: "application/javascript")
<script type="application/javascript">
//<![CDATA[
alert('All is good')
//]]>
</script>

コンテンツを引数に渡す代わりに、以下のようにブロックで渡すことも可能です。

<%= javascript_tag type: "application/javascript" do %>
  alert("Welcome to my app!")
<% end %>

詳しくはjavascript_tag APIドキュメントを参照してください。

7 タグ生成ヘルパー

HTMLタグをプログラム的に生成するための一連のヘルパーメソッドです。

7.1 tag

HTMLタグ名やオプションを指定してHTMLタグを生成します。

以下の書式であらゆるHTMLタグを生成できます。`

tag.タグ名(追加コンテンツ, オプション)

brdivsectionarticleなど任意のタグ名を指定できます。

以下はよく使われる例です。

tag.h1 "All titles fit to print"
# => <h1>All titles fit to print</h1>

tag.div "Hello, world!"
# => <div>Hello, world!</div>

また、生成するタグには以下のようにオプションで属性も指定できます。

tag.section class: %w( kitties puppies )
# => <section class="kitties puppies"></section>

さらに、tagヘルパーにdataオプションを指定するときは、サブ属性のキーバリューペアを含むハッシュを渡すことでHTMLのdata-*属性を複数追加できます。JavaScriptで適切に動作させるため、指定したサブ属性名に含まれるアンダースコア_を以下のように-に置き換えてからdata-*属性に変換します。

tag.div data: { user_id: 123 }
# => <div data-user-id="123"></div>

詳しくはtag APIドキュメントを参照してください(訳注: tagヘルパーで生成されるタグはHTML5に準拠しており、閉じタグの自動追加やコンテンツのブロック渡しなどもサポートしています)。

7.2 token_list

引数で渡したトークンをスペース区切りの文字列にして返します。このヘルパーメソッドは、CSSクラス名を生成するclass_namesメソッドのエイリアスです。

token_list("cats", "dogs")
# => "cats dogs"

token_list(nil, false, 123, "", "foo", { bar: true })
# => "123 foo bar"

mobile, alignment = true, "center"
token_list("flex items-#{alignment}", "flex-col": mobile)
# => "flex items-center flex-col"
class_names("flex items-#{alignment}", "flex-col": mobile) # エイリアス
# => "flex items-center flex-col"

8 ブロックをキャプチャする

生成されるマークアップの一部を抽出して、テンプレートやレイアウトファイルで他の部分で利用可能にする一連のヘルパーメソッドです。

マークアップのブロックを変数にキャプチャするcaptureメソッドと、マークアップのブロックをキャプチャしてレイアウトで利用可能にするcontent_forメソッドが提供されています。

8.1 capture

captureメソッドを使うと、以下のようにテンプレートの一部を抽出して変数にキャプチャできます。

<% @greeting = capture do %>
  <p>Welcome to my shiny new web page! The date and time is <%= Time.current %></p>
<% end %>

この@greeting変数は、任意のテンプレートやレイアウトやヘルパーで利用可能になります。

<html>
  <head>
    <title>Welcome!</title>
  </head>
  <body>
    <%= @greeting %>
  </body>
</html>

キャプチャの戻り値は、そのブロックによって生成された文字列になります。

@greeting
# => "Welcome to my shiny new web page! The date and time is 2018-09-06 11:09:16 -0500"

詳しくはcapture APIドキュメントを参照してください。

8.2 content_for

content_forを呼び出すとマークアップのブロックが識別子に保存され、この識別子を後で利用可能になります。他のテンプレートやヘルパーモジュールやレイアウトでyieldにこの識別子を引数として渡すことで、識別子に保存されているコンテンツを以後呼び出せるようになります。

content_forは、content_forブロックでページのタイトルを設定するときによく使われます。

content_forブロックを以下のようにspecial_page.html.erbビューで定義しておいてから、それをレイアウト内でyieldする形で利用すると、content_forブロックを利用しない他のページではcontent_forブロックが生成されないようになります。

<%# app/views/users/special_page.html.erb %>
<% content_for(:html_title) { "Special Page Title" } %>
<%# app/views/layouts/application.html.erb %>
<html>
  <head>
    <title><%= content_for?(:html_title) ? yield(:html_title) : "Default Title" %></title>
  </head>
</html>

上記の例では、content_for?述語メソッドを利用してタイトルを条件付きでレンダリングしていることがわかります。このメソッドは、コンテンツがcontent_forでキャプチャ済みかどうかをチェックして、ビューのコンテンツに応じてレイアウトの一部を調整しています。

さらに、content_forは以下のようにヘルパーモジュール内でも利用できます。

# app/helpers/title_helper.rb
module TitleHelper
  def html_title
    content_for(:html_title) || "Default Title"
  end
end

これで、レイアウト内でhtml_titleを呼び出せば、content_forブロックに保存されたコンテンツを取得できるようになります。special_pageの場合のように、レンダリングされるページでcontent_forブロックが設定されている場合はタイトルが表示され、content_forブロックが設定されていない場合は、デフォルトの"Default Title"テキストが表示されます。

content_forはキャッシュ内では無視されるので、フラグメントキャッシュされる要素ではcontent_forを使わないでください。

capturecontent_forの違いでお悩みの方へ。

captureはマークアップのブロックを変数にキャプチャするために使われ、content_forは、マークアップのブロックを識別子に保存して後で利用可能にするの使われます(content_forは実際には内部でcaptureを呼び出しています)。ただし両者の大きな違いは、複数回呼び出されたときの振る舞いにあります。

content_forは繰り返し呼び出すことが可能であり、特定の識別子用に受け取ったブロックを提供された順序で連結します。以後の個別の呼び出しは、既に保存済みのコンテンツに追加するだけで。 対照的に、captureはブロックのコンテンツのみを返すだけで、以前の呼び出しをトラッキングしません。

詳しくはcontent_for APIドキュメントを参照してください。

9 パフォーマンス測定ヘルパー

9.1 benchmark

コストの高い操作やボトルネックの可能性がある操作をbenchmarkブロックで囲むことでパフォーマンスを測定できます。

<% benchmark "Process data files" do %>
  <%= expensive_files_operation %>
<% end %>

これによってログにProcess data files (0.34523)のような出力が追加されるので、コードを最適化するときにタイミングを比較できるようになります。

benchmarkはActive Supportのメソッドなので、コントローラやヘルパーやモデルでも利用できます。

詳しくはbenchmark APIドキュメントを参照してください。

9.2 cache

アクションやページ全体をキャッシュする代わりに、フラグメントキャッシュでビューの一部をキャッシュできます。フラグメントキャッシュは、メニュー、ニューストピックのリスト、静的なHTMLの断片といった小さな部分をキャッシュするのに有用です。これにより、キャッシュブロックで囲んだビューロジックのフラグメントが、次のリクエストが到着したときにキャッシュストアから配信されるようになります。

cacheメソッドは、キャッシュしたいコンテンツをブロックとして受け取ります。

たとえば、アプリケーションレイアウトのフッターをキャッシュするには、以下のようにcacheブロックでフッターを囲みます。

<% cache do %>
  <%= render "application/footer" %>
<% end %>

モデルのインスタンスに基づいてキャッシュすることも可能です。たとえば、以下のようにcacheメソッドにarticleオブジェクトを渡すと、ページ上の個別の記事をキャッシュして、記事単位でキャッシュするようになります。

<% @articles.each do |article| %>
  <% cache article do %>
    <%= render article %>
  <% end %>
<% end %>

アプリケーションがこのページへの最初のリクエストを受け取ると、以下のような一意のキーを持つ新しいキャッシュエントリがRailsによって書き込まれます。

views/articles/index:bea67108094918eeba32cd4a6f786301/articles/1

詳しくは、フラグメントキャッシュガイドやcache APIドキュメントを参照してください。

10 その他のヘルパー

10.1 atom_feed

Atomフィードは、コンテンツの配信に使われるXMLベースのファイル形式で、ユーザーがフィードリーダーアプリでコンテンツを参照したり、検索エンジンでサイトに関する追加情報を検索したりするのに利用されます。

atom_feedヘルパーを利用することで、Atomフィードを手軽に構築可能になります。主な利用場所はXMLを作成するBuilderテンプレートです。完全な利用例は以下のとおりです。

# config/routes.rb
resources :articles
# app/controllers/articles_controller.rb
def index
  @articles = Article.all

  respond_to do |format|
    format.html
    format.atom
  end
end
# app/views/articles/index.atom.builder
atom_feed do |feed|
  feed.title("Articles Index")
  feed.updated(@articles.first.created_at)

  @articles.each do |article|
    feed.entry(article) do |entry|
      entry.title(article.title)
      entry.content(article.body, type: "html")

      entry.author do |author|
        author.name(article.author_name)
      end
    end
  end
end

詳しくはatom_feed APIドキュメントを参照してください。

10.2 debug

オブジェクトのYAML表現をpreタグで囲んで返します。これにより、オブジェクトを非常に読みやすい形で調べられるようになります。

my_hash = { "first" => 1, "second" => "two", "third" => [1, 2, 3] }
debug(my_hash)
<pre class="debug_dump">---
first: 1
second: two
third:
- 1
- 2
- 3
</pre>

詳しくはdebug APIドキュメントを参照してください。

フィードバックについて

Railsガイドは GitHub の yasslab/railsguides.jp で管理・公開されております。本ガイドを読んで気になる文章や間違ったコードを見かけたら、気軽に Pull Request を出して頂けると嬉しいです。Pull Request の送り方については GitHub の README をご参照ください。

原著における間違いを見つけたら『Rails のドキュメントに貢献する』を参考にしながらぜひ Rails コミュニティに貢献してみてください 🛠💨✨

本ガイドの品質向上に向けて、皆さまのご協力が得られれば嬉しいです。

Railsガイド運営チーム (@RailsGuidesJP)

支援・協賛

Railsガイドは下記の協賛企業から継続的な支援を受けています。支援・協賛にご興味あれば協賛プランからお問い合わせいただけると嬉しいです。

  1. Star
  2. このエントリーをはてなブックマークに追加