Ruby on rails 安全和最好的方式猴子修补一个轨道宝石

Ruby on rails 安全和最好的方式猴子修补一个轨道宝石,ruby-on-rails,ruby,ruby-on-rails-4,rubygems,Ruby On Rails,Ruby,Ruby On Rails 4,Rubygems,我真的试过了。有很多问题,但是很多开发者说“它不适合我”;我是他们中的一员 我在读关于修补rails宝石的最佳方法的书。我已经找到了,但决定使用 我想用猴子来修补这个问题,而不是修补这个问题 使用“thismethod”链接,我认为这应该是可行的,但事实并非如此 控制器: include Xeroizer::Invoice::InvoiceUrl # Invoice.include Xeroizer::Invoice::InvoiceUrl def some_method # @xero

我真的试过了。有很多问题,但是很多开发者说“它不适合我”;我是他们中的一员

我在读关于修补rails宝石的最佳方法的书。我已经找到了,但决定使用

我想用猴子来修补这个问题,而不是修补这个问题

使用“thismethod”链接,我认为这应该是可行的,但事实并非如此

控制器:

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\u url”


如何将自定义方法添加到rails gem的类中?

假设您正试图使用
Xeroizer::Record::InvoiceModel
对补丁进行monkey-patch操作,那么在第一次提到
Xeroizer::Record::InvoiceModel
之后,您可能只需执行以下操作即可(以使rails自动加载它):


这将覆盖原始的
invoice\u url
方法。原始的一个仍然可以使用
super

从预先指定的调用,您可以尝试将您的代码作为initializer@Alfie我想我已经试过使用Xeroizer::PrivateApplication.class\u eval…,但从未奏效。也许我做得不对。我看不到有人试图修补任何东西。你能详细说明一下你想要实现什么吗?@mudasobwa这是我第一次尝试“猴子补丁”,我以为这意味着给宝石添加一个自定义方法?否?
invoice\u url
是一种自定义方法,它不在gem中。我想将自定义方法(
invoice\u url
)添加到
InvoiceModel
。确定。我现在得到了错误的参数数量(给定1,预期为0)。我的模块正确吗?我有
invoice\u url(id)
当它说expected 0时,它需要一个参数。为什么?“我现在得到了错误数量的参数(给定1,预期为0)”-我不是算命师。请共享stacktrace。另外,请确保原始的
Xeroizer::Record::InvoiceModel
没有名为
invoice\u url
的方法。如果是这样,您可以通过向参数添加默认值来解决此问题:
def invoice\u url(id=nil)
。哦!!!!!!我应该使用
put
而不是
Rails.logger
它可以正常工作!它工作!!!谢谢
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.prepend Xeroizer::Invoice::InvoiceUrl