Rails - 扩展 Ruby Gem

Posted

技术标签:

【中文标题】Rails - 扩展 Ruby Gem【英文标题】:Rails - Extend a Ruby Gem 【发布时间】:2013-07-27 23:48:42 【问题描述】:

我想向 ActiveMerchant gem 添加一些功能以测试 PayPal Express 网关,已为此尝试了拉取请求,但在 Github 上被拒绝了。

我想向 ActiveMerchant Billing 模块添加一个类:

module ActiveMerchant #:nodoc:
  module Billing #:nodoc:
    class PaypalBogusGateway < BogusGateway

      # some codes here

    end
  end
end

我通过下载 gem 并将其拉入本地项目并将我的新文件放入其中成功地完成了此操作:

#Gemfile
gem 'activemerchant', '1.34.1', path: "vendor/gems/activemerchant-1.34.1", require: 'active_merchant'

当然,这不是最好的主意,因为如果需要,我必须手动提取任何更新。

有什么方法可以使用从 RubyGems 源中提取的 gem 将类添加到他们的模块中?

谢谢

编辑

将它放在 lib 文件夹中应该可以,但我的代码需要从 gem 中继承一些类,例如:

require File.dirname(__FILE__) + '/paypal/paypal_common_api'
require File.dirname(__FILE__) + '/paypal/paypal_express_response'
require File.dirname(__FILE__) + '/paypal_express_common'

将 File.dirname(FILE) 替换为 gem 的安装位置...这在服务器环境中会有所不同,对吧?

【问题讨论】:

您应该能够将新类添加到 rails 应用程序的 lib 目录(或其他位置,如果不是 rails),它应该“正常工作” 查看编辑,您有什么想法吗?我想我需要知道在 bundle 命令之后 gems 是如何在不同系统上定位的。 是的,这是最后的 Rails 3 【参考方案1】:

将 activemerchant 添加到 Gemfile,捆绑安装

config/application.rb 中确保 lib 包含在自动加载路径中

# need to uncomment or add this to the configuration
config.autoload_paths += %W(#config.root/lib)

使用嵌套目录将您的类放在文件中以匹配模块

# lib/active_merchant/billing/paypal_bogus_gateway.rb

不要在你的虚假网关、rails 中包含任何 require 语句(通过 bundler 应该需要 Gemfile 中的所有内容)

重启导轨

【讨论】:

【参考方案2】:

您可能只想在 GitHub 上 fork 项目并将您的更改添加到其中。哪怕只是一堂课。然后,在您的 Gemfile 中,执行以下操作:

gem "active_merchant", :git => "git://github.com/<your-user-name-here>/active_merchant.git"

【讨论】:

好主意,谢谢。对于其他想要做类似的人-> help.github.com/articles/fork-a-repo 这对我来说似乎真的很极端。派生一个 gem 只是为了从其中一种 gems 类型中创建一个子类;违背了面向对象编程的全部目的——重用。 @house9 同意。很好的答案:)不知何故,我从来没有想过这个想法。你的应该是公认的答案。 @house9 - 抱歉,我不明白这对 OO 编程有何影响?你的答案有什么不同?使用 Git 我可以更新核心并维护我的代码的子类,因为它仍然会从核心的超类扩展。使用您的答案,我将不得不手动下载并替换核心,对吗? @AdamWaite - 在再次考虑这一点之后 - 你是对的,它并没有打败 OO - 但是你使用 ruby​​gems/bundler - 这些工具为你管理依赖关系,但现在你自己管理它们:“你会为了从 ActiveRecord 继承而分叉 rails 吗?”不太可能,但这似乎是您正在做的事情,以便您可以从 PaypalBogusGateway 继承?

以上是关于Rails - 扩展 Ruby Gem的主要内容,如果未能解决你的问题,请参考以下文章

mac 上的 gem install rails 失败错误:无法构建 gem 本机扩展

安装“nio4r”时使用rails 5.0.0:无法构建gem原生扩展

gem“websocket-rails”及其可扩展性

错误:无法构建 gem 本机扩展(rails 3.2.3 上的 mysql2)

Rails:在 OS X 上安装 PG gem - 无法构建本机扩展

如何在windows的rails上安装ruby