Ruby on Rails:如何列出为页面呈现的部分路径?

sjs*_*jsc 8 ruby ruby-on-rails ruby-on-rails-3

我想列出我的应用程序中每个页面呈现的部分内容.例如,当显示app/tasks/index.html.erb页面时,我想向用户显示以下内容:

为此页面呈现的部分:

tasks/_list.html.erb
tasks/_button.html.erb
tasks/_navigation.html.erb

有没有办法在Ruby on Rails中这样做?

Rya*_*igg 14

是的,在Rails中有这么完美的方法!

正如bdares在他的评论中指出的那样,模板渲染的线条出现在日志中.但是,他们如何在第一时间到达那里?嗯,这与Active Support中LogSubscriber一些东西有关.这方面的文档非常详尽:

ActiveSupport :: LogSubscriber是一个设置为使用ActiveSupport :: Notifications的对象,其唯一目的是记录它们.日志订阅者基于其给定的命名空间向已注册的对象分派通知.

在日志中放置"Rendered ..."行的东西ActionView::LogSubscriber在Rails 3.2中定义的.花一点时间阅读代码.这很好,很整洁.

这是什么东西做的是订阅的一对夫妇的事件中轨,即render_template,render_partialrender_collection方法.它通过调用ActiveSupport::LogSubscriber.attach_to方法来完成此操作,该方法将日志订阅者附加到某些事件.该方法也很有趣,并且定义如下:

def attach_to(namespace, log_subscriber=new, notifier=ActiveSupport::Notifications)
  log_subscribers << log_subscriber
  @@flushable_loggers = nil

  log_subscriber.public_methods(false).each do |event|
    next if 'call' == event.to_s

    notifier.subscribe("#{event}.#{namespace}", log_subscriber)
  end
end
Run Code Online (Sandbox Code Playgroud)

我把这些代码排成一行,因为它与我们的兴趣非常相关.这是什么东西做的是调用subscribe了上notifier对象.notifier默认情况下ActiveSupport::Notifications,该对象值得记住.Rails中该类文档也在API中.

subscribe被调用时,它穿过的名称event.这是什么?嗯,这是课堂上的每一个公共方法.当LogSubscriber定义子类,它定义了两个公共方法:render_template,render_partialrender_collection.这些是将为此日志订阅者订阅的事件.


现在,这与我们的兴趣相关,因为我们将使用相同的东西在视图中订阅这些事件.第一步是让ActiveSupport::Notfications我们想要订阅所有部分渲染事件.我们可以通过创建一个新的内容来before_filter实现ApplicationController:

before_filter :log_partial_events

def log_partial_events
  @partial_events = []
  ActiveSupport::Notifications.subscribe("render_partial.action_view") do |event_name, start_at, end_at, id, payload|
  @partial_events << payload[:identifier]
end
Run Code Online (Sandbox Code Playgroud)

我们订阅的render_partial事件是action_view命名空间中的事件,这ActionView::LogSubscriber正是订阅的事件之一.渲染部分时会发生什么,这个块将被调用并传入一些数据.

event_name:事件的名称. start_at:活动开始的时间. end_at:活动结束的时间. id:此事件的唯一标识符. payload:有关此事件的一些有效内容信息.

当钩子被调用时,它会将identifier键添加payload到方法顶部定义的数组中.

然后在视图中,要访问这些列表,您可以执行以下操作:

<%= debug @partial_events %>
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了,瑞恩!它工作得很好.感谢您提供非常清晰的教程和说明!:) (2认同)