从另一个 gem 覆盖一个 gem 内的方法

2023-11-29

好的,我正在开发一个 Rails gem,我希望它覆盖 sprocket 中的特定方法。

我要重写的方法是:链轮::Base.digest这样我就可以在编译应用程序的资产时根据我的 gem 版本来确定指纹。

我该怎么做呢?

在我的 gem 中,我创建一个文件 lib/sprockets/base.rb 并放置以下代码:



class Sprockets::Base                                                                                                                                                                                                                                                           
  def digest
    @digest = digest_class.new.update(MyGem::VERSION)
    @digest.dup
  end
end
  

当我跑步时bundle exec rake assets:precompile I get:

undefined method 'logger=' for #<Sprockets::Environment:0x1315b040>

因此,在我看来,整个类似乎都以某种方式被重写(这失去了该方法以及其他方法),而不仅仅是重写一个方法。

如果我将该代码片段直接包含到使用这两个 gem 的应用程序的 rakefile 中,那么一切都会完美运行。


以这种方式覆盖整个 Ruby 类是不可能的,但我认为它is可能会阻止原始类加载...如果它使用自动加载。我很好奇,所以我查看了https://github.com/sstephenson/sprockets/blob/master/lib/sprockets.rb,是的,Sprockets 正在使用自动加载。

autoload :Base, "sprockets/base"

重要的是,那doesn't加载代码。它只是告诉 Ruby,如果/当遇到名为“Sprockets::Base”的未定义常量时,从指定文件加载它。您的补丁在任何地方调用之前定义了 Sprockets::Base,从而阻止加载原始文件。

当您将补丁移至 Rakefile 时,Rails 中的某些内容已经引用了 Sprockets::Base,从而加载了原始代码。然后将你的补丁干净地贴在上面。

我从未真正使用过自动加载,所以我不确定应该如何处理这样的情况。但我敢打赌,这会起作用:

Sprockets::Base
class Sprockets::Base
  def digest
...

通过首先引用该类,您应该强制 Ruby 加载原始类。然后您就可以安全地进行重写其方法之一的工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从另一个 gem 覆盖一个 gem 内的方法 的相关文章

  • Paperclip 会自动清理文件名吗?

    我正在使用 Thoughtbot回形针宝石 https github com thoughtbot paperclip处理文件上传 我发现当我上传文件名中包含空格的文件时 它会用下划线替换空格来存储 那挺好的 我还尝试上传带有特殊字符的文件
  • 如何使用键盘进入 ruby​​-debug 运行 Rails 应用程序?

    我正在运行 ruby debugbundle exec rdebug script server在 Rails 2 3 上 当我按下Ctrl C 它退出整个程序和调试器 我希望它停止执行程序并将我带入调试器会话 I tried catch
  • 您推荐使用哪些工具来分析 Rails 应用程序? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我一直在寻找 Rails 的分析工具 我目前正在玩和测试 ruby prof 和 Railsbench 但我对使其工作所需的大量调整和修改
  • Facebook 注册后重定向至页面

    我正在尝试在成功 Facebook 注册 未登录 后重定向用户 我想重定向到 getstarted welcome用户注册后首次 我的omniauth回调是 def facebook You need to implement the me
  • 单表继承发现问题

    我有以下3个rails类 它们都存储在一张表中 使用rails的单表继承 class Template lt ActiveRecord Base class ThingTemplate lt Template class StockThin
  • 使用 bcrypt-ruby 使用版本 $2y 验证哈希密码

    我们陷入了困境 需要使用 Ruby 根据现有的用户数据库对用户进行身份验证 用户的密码都是使用password compat PHP库生成的 所有散列密码均以 2y 开头 我一直在使用 bcrypt ruby 尝试对用户进行身份验证 但没有
  • Codekit文件权限问题(只读文件系统@dir_s_mkdir - /.sass-cache)

    出现以下错误 Compiling failed with this error Errno EROFS on line 239 of System Library Frameworks Ruby framework Versions 2 6
  • 如何在配置/初始化程序中使用 YML 值

    我正在努力将 Facebook 集成到我的应用程序中 为此 我使用 koala devise 和omniauth 对于考拉 我有 config facebook yml development app id 123123132123 sec
  • env 配置文件中未初始化的常量 ActiveSupport::EventedFileUpdateChecker

    我是 Ruby on Rails 的新手 运行 捆绑 命令进行更新 安装后 当我尝试执行以下操作时rails s or rails g mongoid config控制台返回以下消息开头 home myUser proyect config
  • 安装 Sass 时出错(Ruby 2.5.0.1、MSYS2 20161025.0.0)

    我尝试安装 Sass 我安装了Ruby and MSYS2在此之前 来自所有人的最新消息巧克力味 https chocolatey org choco install ruby choco install msys2 看来它们已正确安装 r
  • ruby中如何获取屏幕分辨率

    如何在ruby脚本中获取屏幕分辨率 高度 宽度 在 Linux 上 x y xrandr scan current d x d flatten 在 Windows 上 使用WIN32OLE等 http www ruby forum com
  • :confirm 在使用 Rails 3 和 jQuery UJS 时忽略 Rails 中的选项

    我的 Rails 应用程序中有一个项目表 每个项目都有一个删除链接 如下所示 但是 即使用户单击对话框上的 取消 也会发送删除请求 有想法该怎么解决这个吗 我正在使用 Rails 3 Beta 3 以及 jQuery 库和随附的 jQuer
  • Rails 模型中的多个 counter_cache

    我正在学习 Rails 遇到了一个小问题 我正在编写带有任务列表的非常简单的应用程序 因此模型看起来像这样 class List lt ActiveRecord Base has many tasks has many undone tas
  • 通过 has_many 进行多个数据库连接

    如何通过使用多个数据库连接来创建 has many 我有一个名为 master 的数据库 其中保存位置信息 这是从单独的应用程序更新的 用户可以访问许多位置 但所有其他模型都位于另一个名为 budget 的数据库中 以下是模型的设置方式 p
  • blueprint/screen.css 未预编译

    我一直在遵循 Michael Hartl 出色的 RoR 教程 但我使用的是 RoR 3 1 我是 RoR 3 1 的新手 需要与资产管道相关的帮助 这是我的问题 在继续第 5 3 节之前 我想先转到 Heroku 看看事情如何发展 令我惊
  • Ruby 反向柯里化:这可能吗?

    关于 Ruby 1 9 x 中的柯里化 我一直在某些地方使用它 并且可以像基本上支持 proc 参数的默认参数一样进行翻译 p proc x y z x y z p curry 1 gt returns a lambda p curry 1
  • 在 Rails 上制作 ruby​​ 占用更少的内存

    我正在尝试运行 Ruby on Rails 项目 redmine http www redmine org 在 VPS 上 它可以工作 但需要相当多的内存 与 VPS 的其余部分相比 rails 应用程序的使用量非常少 我的服务器上也运行着
  • Rails - 使链接与 ajax 一起工作

    我有一个链接 应该使用 ajax 加载它旁边的部分内容 而无需重新加载页面 链接在这里 这是链接应该转到的控制器 class ProfilesController lt ApplicationController def profile f
  • Rails 建模:将 HABTM 转换为 has_many :through

    我正在现有的 Rails 站点上进行维护工作 并且遇到了一些由多对多关联引起的问题 看起来该网站最初是使用has and belongs to many对于一些业务逻辑变得更加复杂的关系 所以我需要使用has many through而是支
  • Rails 模型测试 - 模拟与工厂

    Rails 测试模拟对象与使用工厂对象的最佳实践是什么 应该嘲笑only当模型可能转到外部源时使用 或者 您是否仅在测试实际模型并使用模拟来处理其他所有内容时才使用工厂 例如 如果我们有一个包含客户和订单的销售系统 那么当我们测试客户模型时

随机推荐

  • 如何使用 netbeans 在 java 中每次掷骰子后询问用户是否愿意继续游戏?

    我需要帮助解决这个问题 掷骰子游戏是用两个六面骰子进行的 玩游戏的用户将掷两个骰子 并生成两个介于 1 到 6 之间的随机数 两个数字的总和将用于决定下一步 如果总和为 2 3 或 12 则玩家获胜 如果总和是 7 或 11 那么他 她就输
  • 关闭 SKScene 返回 UIKit 菜单

    一旦我的 SpriteKit 游戏结束 我想回到我的UIKit MenuViewController 根据我到目前为止所学到的 使用协议 委托是最好的 选项 但我无法让它发挥作用 我知道该协议可能会高于类声明GameViewControll
  • 运行 Fiddler 作为 HTTP 到 HTTPS 反向代理

    我的机器上正在运行一项服务 该服务在 HTTPS 上发布 在 HTTP 上启动似乎有点复杂 某个远程计算机通过 HTTP 对我的计算机执行调用 这不受我的控制 我想对我的服务执行一些非性能关键的测试 看起来最简单的方法是使用有点像 HTTP
  • 在 Fortran 的 SYSTEM 子例程中使用变量

    如何在执行的命令中使用变量system子程序调用 例如 如果我想创建多个目录 例如test 1 1 test 1 2 依此类推 直到test 3 3那么我的代码应该是什么 我正在尝试以下代码 但似乎无法弄清楚在 部分要写什么 integer
  • Git 错误:无法提交配置文件

    我正在尝试将新的远程存储库 GitHub 添加到现有项目 但遇到了一个我以前从未见过且不理解的错误 git remote add github email protected me myrepo git error could not co
  • 标头和 Selenium Webdriver 2

    有没有办法在 Selenium WebDriver 测试中添加标头 与 Firefox 修改标头插件一样 我无法使用 HtmlUnitDriver 因为浏览器必须可见 WebDriver 不允许您使用任何基于浏览器的驱动程序更改或设置标头
  • 如何在设计时禁用子控件?

    我有自己的控制权 源自TCustomPanel 它有一个孩子 TEdit 在上面 type TMyControl class TCustomPanel private FEditor TEdit public constructor Cre
  • 从字典创建类实例属性?

    我正在从 CSV 导入并大致以以下格式获取数据 Field1 3000 Field2 6000 RandomField 5000 字段的名称是动态的 嗯 它们是动态的 因为可能不止 Field1 和 Field2 但我知道Field1 an
  • 如何将 EntityFramework、Repository、UnitOfWork 和 Automapper 结合到一个 MVC 应用程序中?

    首先我决定创建一个名为它的接口IDataAccessLayer并开始将所有内容放入其中 类似的方法GetUsers GetUser int id GetOrderByNumber int number DeleteOrder int Id
  • 为什么要在instanceOf之后进行强制转换?

    在下面的例子中 来自我的课程包 我们想要给Square实例c1其他对象的引用p1 但前提是这两个类型是兼容的 if p1 instanceof Square c1 Square p1 我在这里不明白的是我们首先检查p1确实是一个Square
  • 以编程方式设置 Mozilla Firefox 的默认主页?

    我知道如何设置 Google Chrome 和 Internet Explorer 的默认主页 但我在 Google 和 Stackoverflow 上搜索了如何使用 Mozilla Firefox 实现此目的的可能答案 但没有机会 我想知
  • 有没有相当于mySQL的IN的php?

    在 mySQL 中编写 select 语句时 如果我想提取列值等于多个值之一的记录 我可以这样说 SELECT FROM myTable WHERE myColumn IN 1 5 7 在 PHP 中使用 OR 完成类似任务的唯一方法是吗
  • 推送通知 - 捕捉它们?

    好吧 这就是交易 我的应用程序正在使用 iOS 通知 在应用程序委托中 如果应用程序位于 我会在 didReceiveRemoteNotification 中捕获它们前景如果应用程序在 我会在 didBecomeActive 中捕获它背景我
  • Android 模拟器看不到,如何移动它?

    我在笔记本电脑上使用了一个额外的显示器 并将 Android 模拟器移到了那里 即使不再连接显示器 它似乎也会记住该位置 有什么方法可以重置窗口的位置 使其再次可见吗 您可以使用此方法来移动 Windows 环境中屏幕外的任何窗口 首先通过
  • 每个 App Engine 应用程序允许使用 3,000 个文件(而不是 1,000 个),这是否正确?

    根据这篇维基百科文章 每个应用程序允许 3 000 个文件 但我在 Google Groups 上读到一个帖子 有人的 Java 应用程序在尝试上传超过 1 000 个文件时收到警告 他通过将一些文件捆绑在 jar 中来解决这个问题 哪个是
  • 使用 Dir 按文件系统顺序从文件夹返回文件

    PixPath 是 jpg 文件夹的完整路径 我使用如下代码来处理每个 jpg fileName Dir PixPath Do Until fileName If Right fileName 4 jpg Then fileName Dir
  • 如何通过 LINQ 展平树?

    所以我有简单的树 class MyNode public MyNode Parent public IEnumerable
  • Spring MVC 400 错误请求 Ajax

    我一直在 Ajax 请求上收到 400 Bad Request 我不知道这会出什么问题 我在用着
  • 使用 JdbcRowSet 时出现“java.sql.SQLException:ResultSet 不可更新”

    我想使用 RowSet 接口实现更新 但遇到一些错误 我尝试过以下代码 Load the JDBC driver Class forName com mysql cj jdbc Driver System out println Drive
  • 从另一个 gem 覆盖一个 gem 内的方法

    好的 我正在开发一个 Rails gem 我希望它覆盖 sprocket 中的特定方法 我要重写的方法是 链轮 Base digest这样我就可以在编译应用程序的资产时根据我的 gem 版本来确定指纹 我该怎么做呢 在我的 gem 中 我创