【问题标题】:How to profile a rails controller that returns a json response with rack-mini-profiler?如何使用 rack-mini-profiler 分析返回 json 响应的 rails 控制器?
【发布时间】:2026-02-17 15:05:01
【问题描述】:

我在我的 rails 3.2 项目中使用 rack-mini-profiler。

在gemfile中:

gem 'rack-mini-profiler'

一切都很好。但我的应用程序主要是一组 json 端点。因此,虽然能够检查 html 页面的性能非常有用,但我也希望能够查看返回 json 的控制器的性能。

我的控制器示例:

class UsersController < BaseController
  def json_method
    # you don't see the mini profiler ui for this controller
    render json: { users: [:foo, :bar]}
  end
end

如果我转到 localhost:3000/users/json_method,我会看到我的 json 响应,但看不到分析器 ui。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 profiling rack-mini-profiler


    【解决方案1】:

    在开发中,rack-mini-profiler gem 会默认收集之前的 JSON 调用,并将其显示在可从 HTML 页面访问的菜单中。无需更改代码。

    所以,发出您的 JSON 请求,然后点击任何其他 HTML 页面,它将在列表中可用。我们用它来取得很好的效果。如果您的 Rails 应用程序只是一个 JSON API 服务,请确保您的公共文件夹中至少有一个 404.html,然后点击如下内容:

    http://localhost/404.html
    

    【讨论】:

    • 打开两个选项卡:一个用于 JSON,另一个用于任何 不是 JSON 的页面。进行 JSON 调用,然后刷新不是 JSON 的页面,瞧,JSON 调用将在顶部附近。这不是最有效的方法,但绝对有效!
    【解决方案2】:

    如果 rack mini profiler 无法显示结果,它将收集它们,直到它可以在下一个 HTML 页面上显示。所以,我使用的解决方案是:

    发出 JSON 请求并 然后点击我选择的 HTML 页面。 结果将与最新的 HTML 配置文件一起显示。

    http://tech.eshaiju.in/blog/2016/02/25/profile-api-endpoints-using-rack-mini-profiler/

    【讨论】:

      【解决方案3】:

      在第二个标签中,你可以访问这个网址/rack-mini-profiler/requests,在那里你可以看到最后的请求日志

      【讨论】:

        【解决方案4】:

        作为第一个解决方案,您可以将格式设置为 html,并在 html 页面内呈现:

        控制器:

        class UsersController < BaseController
          def json_method
            @users_json { users: [:foo, :bar]}
            render 'index', formats: ['html']
          end
        end
        

        在 app/views/users/index.html.erb 中:

        Users:<br/>
        <%= @json.inspect %>
        

        我不太关心我的 json 结果,现在我有了分析 ui。

        在不更改控制器的情况下拥有分析 ui 的解决方案会好得多。

        【讨论】:

          【解决方案5】:

          请注意,在使用 rails new api_name --api 初始化的新 Rails API 项目中,ApplicationController 继承自 ActionController::API,而不是 ActionAcontroller::Base。在这种情况下,显示您的 HTML 页面时,迷你分析器可能不会加载。

          我必须将基类更改为ActionController::Base 才能使其工作。如果在您的应用中,您在 HTML 页面上没有看到从 mini-profiler 加载资源的请求,您可能需要尝试此更改。我花了很长时间才弄清楚。

          另请注意,您确实需要在模板中至少包含 &lt;body&gt; 标记才能呈现,否则将无法正确注入迷你分析器 div。

          【讨论】: