gpt4 book ai didi

ruby-on-rails - ruby rails : How do you list the partial paths that are rendered for a page?

转载 作者:数据小太阳 更新时间:2023-10-29 06:55:41 26 4
gpt4 key购买 nike

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

Partials rendered for this page:

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

在 Ruby on Rails 中有什么方法可以做到这一点吗?

最佳答案

是的,在 Rails 中完全可以做到这一点!

正如 bdares 在他的评论中指出的那样,用于模板渲染的行出现在日志中。但他们最初是如何到达那里的呢?好吧,这与 little something in Active Support called LogSubscriber 有关.这方面的文档非常详尽:

ActiveSupport::LogSubscriber is an object set to consume ActiveSupport::Notifications with the sole purpose of logging them. The log subscriber dispatches notifications to a registered object based on its given namespace.

将“Rendered ...”行放入日志的是 ActionView::LogSubscriber这是定义 like this within Rails 3.2 .花点时间阅读代码。它漂亮整洁。

这是在订阅 Rails 中的几个事件,即 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

我已将此代码放在一行中,因为它与我们的兴趣极为相关。这是在调用subscribenotifier 上目的。 notifier默认情况下,对象是 ActiveSupport::Notifications ,记住这一点很重要。 documentation for that class in Rails is in the API too .

subscribe被调用,它通过 event 的名称.这是什么?好吧,它是类中的每一个公共(public)方法。当 LogSubscriber定义了子类,它定义了几个公共(public)方法:render_template , <强> render_partialrender_collection .这些是将为该日志订阅者订阅的事件。


现在,这与我们的兴趣相关,因为我们将使用相同的东西来订阅 View 内的这些事件。第一步是让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

我们订阅的事件是 render_partial action_view 内的事件命名空间,这正是 ActionView::LogSubscriber 的事件之一正在订阅。呈现部分时会发生什么情况,即调用此 block 并传入一些数据。

event_name :事件的名称。 start_at :事件开始的时间。 end_at :事件结束的时间。 id :此事件的唯一标识符。 payload : 关于这个事件的一些负载信息。

当钩子(Hook)被调用时,它会添加 identifier来自 payload 的 key 到方法顶部定义的数组。

然后在 View 中,要访问这些列表,您可以这样做:

<%= debug @partial_events %>

关于ruby-on-rails - ruby rails : How do you list the partial paths that are rendered for a page?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15468894/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com