安全且最佳的方式来monkey patch Rails gem

3
我尝试过了,认真地。有很多问题,但许多开发者都说“对我没用”,我是其中之一——很遗憾。
我正在研究最好的猴子补丁Rails gem的方法。我找到了几个,但决定使用这种方法
我想要猴子补丁xeroizer gem,而不是invoice.rb model
# lib/xeroizer/invoice/invoice_url.rb

module Xeroizer
  module Invoice
    module InvoiceUrl
      def invoice_url(id)
        @application.http_get(@application.client, "#{url}/#{CGI.escape(id)}/OnlineInvoice")
      end
    end
  end
end

按照“这个方法”的链接,我认为这应该有效,但实际上并没有。 控制器:
include Xeroizer::Invoice::InvoiceUrl
# Invoice.include Xeroizer::Invoice::InvoiceUrl

def some_method
  # @xero is in a private method. It's here for short demonstration
  @xero = Xeroizer::PrivateApplication.new("MY_CONSUMER_KEY", "MY_SECRET_KEY", "#{Rails.root}/privatekey.pem")
  Rails.logger = @xero.Invoice.invoice_url("ad61ea97-b9e9-4a1e-b754-7c19e62f8cd7")
end

“Xeroizer::Record::InvoiceModel”没有定义“invoice_url”方法。如何向Rails gem的类添加自定义方法?

你能试着将你的代码放在初始化器中吗? - Alfie
@Alfie 我想我尝试过使用 Xeroizer::PrivateApplication.class_eval ... 但从来没有成功过。也许我没有做对。 - Sylar
我没有看到任何尝试猴子补丁的行为。您能否详细说明您想要实现什么? - Aleksei Matiushkin
@mudasobwa 这是我第一次尝试“猴子补丁”,我以为它意味着向 gem 添加自定义方法?不是吗? - Sylar
1个回答

4
假设您正在尝试使用Xeroizer::Record::InvoiceModel对Xeroizer::Invoice::InvoiceUrl进行猴子补丁,您可以在第一次提到Xeroizer::Record::InvoiceModel之后立即执行以下操作(以使Rails自动加载它):
Xeroizer::Record::InvoiceModel.prepend Xeroizer::Invoice::InvoiceUrl

这将覆盖原始的invoice_url方法。在使用super进行前置调用时,仍然可能调用原始方法。


invoice_url是一个自定义方法,它不在gem中。我想向InvoiceModel添加一个自定义方法(invoice_url)。 - Sylar
好的。我现在得到了“参数数量错误(给定1个,期望0个)”。我的模块正确吗?我有一个invoice_url(id),它期望一个参数,但是它说期望0个。为什么? - Sylar
“我现在收到错误的参数个数(给定1,期望0)”- 我不是算命师。请分享堆栈跟踪。此外,请确保原始的 Xeroizer::Record::InvoiceModel 没有名为 invoice_url 的方法。如果有的话,您可以通过向参数添加默认值来修复问题: def invoice_url(id = nil) - Aleksei Matiushkin
哦!!!!我应该使用“puts”而不是“Rails.logger”。它起作用了,天啊! 它起作用了!!! 谢谢!!!! - Sylar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接