2

今日は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'前のレイアウトファイルに表示されますyieldnavbar_manager.set_active_entryでは、以前に呼び出されたことがどのように発生するのnavbar_manager.each_entryでしょうか。より一般的には、Embedded Rubyはどのような順序で処理されますか?

そして、私が単に幸運である場合:私が望む順序を確実にする方法はありますか?

Ruby1.9.3とRails3.2を使用しています

4

1 に答える 1

2

コード実行のシーケンス:

  1. foo#indexを呼び出すと、対応するビューコンテンツがviews/foo/index.html.erbファイルから作成されます。

  2. 適切なレイアウトが処理されます。この場合、views/layouts/application.html.erbファイルは処理のためにピックアップされます。

  3. <%= render 'shared/navbar' %>レイアウト内のステートメントにより、navbarパーシャルが処理されます。この時点で、表示されるビューコンテンツはすでに利用可能です(上記の手順1の一部としてnavbar_manager、ハイライトするための適切なセクションをマークします。

  4. <%= yield %>レイアウトのステートメントは、ビューのコンテンツを挿入します(ステップ1とステップ3で処理されます)。

  5. 処理が完了した結果が表示されます。

log/development.logさまざまなビューとパーシャルがどのように実行されたかを確認するための優れたリソースです。

これが私のアプリの1つの例です:

Started GET "/" for 127.0.0.1 at 2012-10-13 14:42:23 -0600
Processing by DashboardController#welcome as HTML   
User Load (0.8ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1  User Load (0.8ms)  SELECT `users`.* FROM `users`
Rendered dashboard/welcome.html.erb within layouts/application (2.6ms)
Rendered layouts/_navigation.html.erb (1.5ms)
Rendered layouts/_messages.html.erb (0.2ms)
SQL (1.4ms)  UPDATE `users` SET `updated_at` = '2012-10-13 20:42:23' WHERE `users`.`id` = 1
Completed 200 OK in 104ms (Views: 88.6ms | ActiveRecord: 3.1ms)

この例では、dashboard#welcomeを呼び出すと、ビューが最初に処理され、;dashboard/welcome.html.erb内でレンダリングされます。layouts/applicationレイアウトは、レンダリングプロセスを完了する前にnavigation、パーシャルも呼び出します。messages

于 2012-10-18T16:02:34.423 に答える