我今天做了一点 Ruby on Rails 魔术,它以某种方式起作用,但我不知道如何。
我正在编写一个应用程序,它应该在每个页面的顶部都有一个导航栏,所以我编写了一个部分,我在我的默认布局中呈现:
views/layouts/application.html.erb
:
...
<%= render 'shared/navbar' %>
<%= yield %>
...
但我希望突出显示当前选定部分的链接。我认为每个链接中的一系列if
语句会很丑陋,所以我编写了一个或两个帮助程序类来管理导航栏上显示的链接。我会详细说明它们是如何工作的,因为它们现在微不足道且无关紧要,但它们的使用方式如下:
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
呢?更一般地说:嵌入式 Ruby 的处理顺序是什么?
如果我很幸运:有没有办法确保我想要的订单?
我正在使用 Ruby 1.9.3 和 Rails 3.2