繁体   English   中英

猴子修补铁轨宝石的安全和最佳方式

[英]Safe and best way to monkey patch a rails gem

我认真地试过了。 很多问题,但很多开发人员说“它不适合我”; 我是其中之一 - 据说。

我正在阅读有关修补rails gem的最佳方法。 我发现很少,但决定使用这种方法

我想修补xeroizer gem而不是invoice.rb 模型

# 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

继续使用“this method”链接,我认为这应该可行,但它确实有效。

控制器:

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的类中?

假设您正在尝试使用Xeroizer::Invoice::InvoiceUrl Xeroizer::Record::InvoiceModel进行Xeroizer::Invoice::InvoiceUrl ,您可能会在第一次提到Xeroizer::Record::InvoiceModel之后立即执行以下Xeroizer::Record::InvoiceModel (以使Rails自动加载它) ):

Xeroizer::Record::InvoiceModel.prepend Xeroizer::Invoice::InvoiceUrl

这将覆盖原始invoice_url方法。 原始的一个仍然可以从使用super的前置调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM