今日はRubyonRailsの魔法を少しやってみましたが、どういうわけかうまくいきましたが、方法がわかりません。
すべてのページの上部にナビゲーションバーがあるはずのアプリケーションを作成しているので、デフォルトのレイアウトでレンダリングするパーシャルを作成しました。
views/layouts/application.html.erb
:
...
<%= render 'shared/navbar' %>
<%= yield %>
...
しかし、現在選択されているセクションへのリンクを強調表示したかったのです。すべてのリンクの一連のif
ステートメントは醜いと判断したので、ナビゲーションバーに表示されるリンクを管理するヘルパークラスを1つか2つ作成しました。それらは今のところ些細で無関係なので、どのように機能するかについては詳しく説明しませんが、次のように使用されます。
views/shared/_navbar.html.erb
:
...
<% navbar_manager.each_entry do |entry, active| %>
<li <% if active %>class="active"<%end%>>
<%= link_to entry.label, entry.url %>
</li>
<% end %>
...
今、私はnavbar_manager
どのエントリがアクティブであるかを知る必要があるだけでした。ナビゲーションバーの操作はビューと密接に関連しているため、コントローラーに適切なコードを配置せず、代わりに次のようにビューファイルで実行することにしました。
views/foo/index.html.erb
<% navbar_manager.set_active_entry(:home) %>
...
大きな驚き:それは機能します。しかし、今考えてみると、render 'shared/navbar'
前のレイアウトファイルに表示されますyield
。navbar_manager.set_active_entry
では、以前に呼び出されたことがどのように発生するのnavbar_manager.each_entry
でしょうか。より一般的には、Embedded Rubyはどのような順序で処理されますか?
そして、私が単に幸運である場合:私が望む順序を確実にする方法はありますか?
Ruby1.9.3とRails3.2を使用しています