概要

<p><font><font>花見ビューは、プレゼンテーションロジックを定義するオブジェクトです。</font><font>ヘルパーは、便利な機能の集まりでビューを充実させるように設計されたモジュールです。</font></font></p>

<p><font><font>Rubyの基本をいくつか知っているなら、このコンセプトはおそらくおなじかもしれません。</font></font></p>
<pre class=”language-ruby ruby”><code><span class=”k”>module</span> <span class=”nn”>Printable</span>
<span class=”k”>def</span> <span class=”nf”>print</span>
<span class=”nb”>puts</span> <span class=”s2″>”…”</span>
<span class=”k”>end</span>
<span class=”k”>end</span><font></font>
<font></font>
<span class=”k”>class</span> <span class=”nc”>Person</span>
<span class=”kp”>include</span> <span class=”no”>Printable</span>
<span class=”k”>end</span><font></font>
<font></font>
<span class=”no”>Person</span><span class=”p”>.</span><span class=”nf”>new</span><span class=”p”>.</span><span class=”nf”>print</span>
</code></pre>

<p><font><font>同じシンプルなデザインがビューとヘルパーに適用されます。</font></font></p>

<p><font><font>Hanamiにはデフォルトヘルパーが付属していますが、カスタムヘルパーモジュールも定義できます。</font></font></p>

<h2 id=”rendering-context” class=”title”><a name=”rendering-context” class=”anchor” href=”#rendering-context”>      <svg aria-hidden=”true” class=”octicon octicon-link” height=”16″ version=”1.1″ viewBox=”0 0 16 16″ width=”16″>
<path d=”M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z”></path>
</svg>
</a><font><font>レンダリングコンテキスト</font></font></h2>

<p><font><font>ビューは、関連付けられたテンプレートのレンダリングを担当するRubyオブジェクトです。</font><font>このアクティビティのコンテキストは、ビューが応答できる一連のメソッドによってのみ定義されます。</font></font></p>

<p><font><font>ビューにメソッドがある</font></font><code>#greeting</code><font><font>場合は、次のように使用できます</font></font><code>&lt;%= greeting %&gt;</code><font><font>。</font></font></p>

<p><font><font>このデザインにはいくつかの重要な利点があります。</font></font></p>

<ul>
<li><font><font>デバッグが容易になります。</font><font>例外が発生した場合</font></font><strong><font><font>、そのビューは検査する唯一のレンダリングコンテキストであることがわかります</font></font></strong><font><font>。</font></font></li>
<li><font><font>Rubyのメソッドディスパッチャーは</font><font>、多くのメソッドソースのルックアップを行う必要がないため、</font></font><strong><font><font>高速になり</font></font></strong><font><font>ます。</font></font></li>
</ul>

<p><font><font>次のコードを考えてみましょう:</font></font></p>
<pre class=”language-ruby ruby”><code><span class=”c1″># apps/web/views/books/show.rb</span>
<span class=”k”>module</span> <span class=”nn”>Web::Views::Books</span>
<span class=”kp”>include</span> <span class=”no”>Web</span><span class=”o”>::</span><span class=”no”>View</span><font></font>
<font></font>
<span class=”k”>def</span> <span class=”nf”>home_page_link</span>
<span class=”n”>link_to</span> <span class=”s2″>”Home”</span><span class=”p”>,</span> <span class=”s2″>”/”</span>
<span class=”k”>end</span>
<span class=”k”>end</span>
</code></pre>

<p><font><font>我々の見解は</font></font><code>#link_to</code><font><font>、それが含まれているため</font></font><code>Hanami::Helpers::LinkToHelper</code><font><font>、具体的な方法を定義するモジュールに対応しています。</font></font></p>

<h2 id=”clean-context” class=”title”><a name=”clean-context” class=”anchor” href=”#clean-context”>      <svg aria-hidden=”true” class=”octicon octicon-link” height=”16″ version=”1.1″ viewBox=”0 0 16 16″ width=”16″>
<path d=”M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z”></path>
</svg>
</a><font><font>クリーンコンテキスト</font></font></h2>

<p><font><font>巨大なインターフェースを持つヘルパーがいくつかあります。</font><font>考える</font></font><a href=”/guides/helpers/html5″><font><font>HTML5</font></font></a><font><font>や</font></font><a href=”/guides/helpers/routing”><font><font>ルーティング</font></font></a><font><font>ヘルパー、彼らは方法の何百ものタグまたはアプリケーションのルートをマップするために提供しています。</font></font></p>

<p><font><font>それらをビューのコンテキストで直接利用できるようにすると、混乱の原因となり、メソッドのディスパッチ時間が遅くなり、名前の衝突が発生します。</font></font></p>

<p><font><font>100路線のアプリケーションがあるとします。</font><font>Hanamiは相対URIと絶対URIの両方の機能を提供するので、直接使用すると、</font><font>すべてのビューに</font></font><strong><font><font>200のメソッド</font></font></strong><font><font>を</font><font>追加することに</font><font>なります。</font><font>それは過労です。</font></font></p>

<p><font><font>このため、特定のヘルパーは、これらの大量のメソッドにアクセスするプロキシとして機能します。</font></font></p>
<pre class=”language-ruby erb”><code><span class=”cp”>&lt;%=</span> <span class=”n”>routes</span><span class=”p”>.</span><span class=”nf”>home_path</span> <span class=”cp”>%&gt;</span>
</code></pre>

<p><font><font>この場合</font><font>、ビューに追加する</font></font><strong><font><font>メソッドは1つ</font></font></strong><font><font>だけですが、パフォーマンスの問題を引き起こすことなく無限の可能性が開かれます。</font></font></p>

<h2 id=”explicit-interfaces” class=”title”><a name=”explicit-interfaces” class=”anchor” href=”#explicit-interfaces”>      <svg aria-hidden=”true” class=”octicon octicon-link” height=”16″ version=”1.1″ viewBox=”0 0 16 16″ width=”16″>
<path d=”M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z”></path>
</svg>
</a><font><font>明示的インタフェース</font></font></h2>

<p><font><font>Hanamiは、開発者がオブジェクトの明示的かつ意図的な公開インタフェースを設計するよう指導します。</font><font>ほとんどすべてのデフォルトヘルパーは、</font><font>我々の見解で</font></font><strong><font><font>プライベートメソッド</font></font></strong><font><font>を利用可能にします。</font></font></p>

<p><font><font>私たちはテンプレートを混乱させる複雑な表現を避け、ビューがテスト可能であることを確認します。</font></font></p>

<p><font><font>ここで</font><font>は、テンプレート内の</font></font><strong><font><font>貧弱</font></font></strong><font><font>で</font></font><strong><font><font>不確定な</font></font></strong><font><font>コードの</font><font>例を示し</font><font>ます。</font></font></p>
<pre class=”language-ruby erb”><code><span class=”cp”>&lt;%=</span> <span class=”n”>format_number</span> <span class=”n”>book</span><span class=”p”>.</span><span class=”nf”>downloads_count</span> <span class=”cp”>%&gt;</span>
</code></pre>

<p><font><font>このロジックを単体テストしたい場合は、テンプレートをレンダリングして出力をマッチングしない限り、直接ロジックをテストすることはできません。</font></font></p>

<p><font><font>このため</font></font><code>#format_number</code><font><font>、プライベートメソッドとして出荷されている</font><font>ため</font><font>、私たちはインターフェイスに対して明示的なメソッドを定義することを余儀なくされています。</font></font></p>
<pre class=”language-ruby ruby”><code><span class=”c1″># apps/web/views/books/show.rb</span>
<span class=”k”>module</span> <span class=”nn”>Web::Views::Books</span>
<span class=”kp”>include</span> <span class=”no”>Web</span><span class=”o”>::</span><span class=”no”>View</span><font></font>
<font></font>
<span class=”k”>def</span> <span class=”nf”>downloads_count</span>
<span class=”n”>format_number</span> <span class=”n”>book</span><span class=”p”>.</span><span class=”nf”>downloads_count</span>
<span class=”k”>end</span>
<span class=”k”>end</span>
</code></pre>

<p><font><font>このように使用するには:</font></font></p>
<pre class=”language-ruby erb”><code><span class=”cp”>&lt;%=</span> <span class=”n”>downloads_count</span> <span class=”cp”>%&gt;</span>
</code></pre>

<p><font><font>このバージョンは</font></font><strong><font><font>視覚的に簡単</font></font></strong><font><font>で</font></font><strong><font><font>テスト可能</font></font></strong><font><font>です。</font></font></p>

<h2 id=”disable-helpers” class=”title”><a name=”disable-helpers” class=”anchor” href=”#disable-helpers”>      <svg aria-hidden=”true” class=”octicon octicon-link” height=”16″ version=”1.1″ viewBox=”0 0 16 16″ width=”16″>
<path d=”M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z”></path>
</svg>
</a><font><font>ヘルパーを無効にする</font></font></h2>

<p><font><font>Hanamiアプリケーションではヘルパーは必須ではありません。</font><font>それらを取り除きたい場合は、2行のコードを削除するだけです。</font></font></p>
<pre class=”language-ruby ruby”><code><span class=”c1″># apps/web/application.rb</span>
<span class=”nb”>require</span> <span class=”s1″>’hanami/helpers'</span> <span class=”c1″># REMOVE THIS LINE</span><font></font>
<font></font>
<span class=”k”>module</span> <span class=”nn”>Web</span>
<span class=”k”>class</span> <span class=”nc”>Application</span> <span class=”o”>&lt;</span> <span class=”no”>Hanami</span><span class=”o”>::</span><span class=”no”>Application</span>
<span class=”n”>configure</span> <span class=”k”>do</span>
<span class=”c1″># …</span><font></font>
<font></font>
<span class=”n”>view</span><span class=”p”>.</span><span class=”nf”>prepare</span> <span class=”k”>do</span>
<span class=”kp”>include</span> <span class=”no”>Hanami</span><span class=”o”>::</span><span class=”no”>Helpers</span> <span class=”c1″># AND THIS ONE</span>
<span class=”k”>end</span>
<span class=”k”>end</span>
<span class=”k”>end</span>
<span class=”k”>end</span>
</code></pre>