gpt4 book ai didi

ruby-on-rails - 这个 gem 如何与您的错误处理 Hook ?

转载 作者:数据小太阳 更新时间:2023-10-29 07:57:20 24 4
gpt4 key购买 nike

我试图了解 gem 的工作原理,以及如何创建 gem 来覆盖或向 Rails 3 应用程序添加附加功能。

这是一个错误捕获 gem,它通过 http 将错误发布到服务器。

要安装它,您只需添加 gem,然后它会使用您的 api key 创建一个初始化程序。

到目前为止我已经了解了这一部分,但我需要帮助来理解 gem 的执行以及它如何挂接到 rails。

我找到的相关文件是:

https://github.com/airbrake/airbrake/blob/master/lib/airbrake/rails.rb

将方法添加到 ActionController 的位置类:

  if defined?(ActionController::Base)
ActionController::Base.send(:include, Airbrake::Rails::ActionControllerCatcher)
ActionController::Base.send(:include, Airbrake::Rails::ErrorLookup)
ActionController::Base.send(:include, Airbrake::Rails::ControllerMethods)
ActionController::Base.send(:include, Airbrake::Rails::JavascriptNotifier)
end

然后在文件底部执行它:

Airbrake::Rails.initialize


1. You add the gem to your GEMFILE, and call bundle.
2. You run the generator which creates the initializer file:

所以当我的 Rails 应用程序启动时,它将通过初始化程序。

这是 gem 将被实例化的地方,然后在线下的某个地方运行 Airbrake::Rails.initialize完成解析 /lib/airbrake/rails.rb 时的方法文件?

我可以在 railtie.rb 中看到初始化代码文件:

https://github.com/airbrake/airbrake/blob/master/lib/airbrake/railtie.rb

config.after_initialize do
Airbrake.configure(true) do |config|
config.logger ||= ::Rails.logger
config.environment_name ||= ::Rails.env
config.project_root ||= ::Rails.root
config.framework = "Rails: #{::Rails::VERSION::STRING}"
end

if defined?(::ActionController::Base)
require 'airbrake/rails/javascript_notifier'
require 'airbrake/rails/controller_methods'

::ActionController::Base.send(:include, Airbrake::Rails::ControllerMethods)
::ActionController::Base.send(:include, Airbrake::Rails::JavascriptNotifier)
end
end

现在这似乎有意义,因为它在初始化程序运行并设置配置后运行这段代码,它发送 ControllerMethods等到基类。

但这似乎重复了我之前发布的代码,当时事情已经被发送到 ApplicationController调用 Airbrake::Rails.initialize 中的文件.

我希望有人能告诉我事情是如何执行的以及它的顺序是什么,因为我只是没有清楚地看到这个过程是如何工作的。

最佳答案

重复的代码是为了支持不同版本的 rails。

Rails 2.X

Rails 2.X 会查找 rails/init.rb 以确定 gem 是否为 Rails 插件。减速板包含一行:

require 'airbrake/rails'

您对下一步的总结恰到好处:

Is this where the gem will get instantiated and then somewhere down the line run the Airbrake::Rails.initialize method when it finishes parsing the /lib/airbrake/rails.rb file?

Rails 3.X

Rails 3.X 插件通常继承自 Rails::Railtie,以便能够定义 rake 任务,插入启动序列或 do a lot of other interesting things .

lib/airbrake.rb 中的以下行检查 Railtie 类的可用性(相当于检查您是否正在运行 rails 3)并定义 Airbrake::Raltie 如果是的话:

require 'airbrake/railtie' if defined?(Rails::Railtie)

定义 Railtie 时,您不必手动运行它(相当于 Airbrake::Rails.initialize),继承 Rails::Railtie 足以创建您的插件。

补充阅读

如果您想了解 Rails 3 如何实现其模块化,以下文档将很有帮助:

关于ruby-on-rails - 这个 gem 如何与您的错误处理 Hook ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8202058/

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