Ruby on Rails中,如何将gem内部方法替换为长尾关键词?

2026-04-11 17:401阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计548个文字,预计阅读时间需要3分钟。

Ruby on Rails中,如何将gem内部方法替换为长尾关键词?

您好,我正在研究一个Rails的gem。我希望它能覆盖sprockets中的特定方法。我想覆盖的方法是:Sprockets::Base.digest。这样,在编译应用程序的资产时,我可以从我的gem版本中删除特定的指纹。我应该怎么做?

好吧,我有一个我正在研究的rails gem,我希望它覆盖sprockets中的特定方法.

我想覆盖的方法是:Sprockets::Base.digest,以便在编译应用程序的资产时,我可以将指纹从我的gem版本中删除.

我该怎么做呢?

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

Ruby on Rails中,如何将gem内部方法替换为长尾关键词?

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

当我运行bundle exec rake资产时:precompile我得到:

未定义的方法’logger =’用于#< Sprockets :: Environment:0x1315b040>

因此,在我看来,整个类都会以某种方式被覆盖(这会丢失它,以及其他方法),而不是仅仅覆盖一个方法.

如果我将这段代码直接包含在使用两个宝石的应用程序的rakefile中,那么事情就可以完美地运行.

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

autoload :Base, "sprockets/base"

重要的是,这不会加载代码.它只是告诉Ruby,如果/遇到一个名为“Sprockets :: Base”的未定义常量,则从指定文件加载它.您的补丁定义Sprockets :: Base,然后在任何地方调用它,从而阻止加载原始文件.

当您将补丁移动到Rakefile时,Rails中的某些东西已经引用了Sprockets :: Base,加载了原始代码.然后你的补丁干净利落地放在上面.

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

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

通过首先引用该类,您应该强制Ruby加载原始类.然后你可以安全地开展覆盖其中一种方法的业务.

本文共计548个文字,预计阅读时间需要3分钟。

Ruby on Rails中,如何将gem内部方法替换为长尾关键词?

您好,我正在研究一个Rails的gem。我希望它能覆盖sprockets中的特定方法。我想覆盖的方法是:Sprockets::Base.digest。这样,在编译应用程序的资产时,我可以从我的gem版本中删除特定的指纹。我应该怎么做?

好吧,我有一个我正在研究的rails gem,我希望它覆盖sprockets中的特定方法.

我想覆盖的方法是:Sprockets::Base.digest,以便在编译应用程序的资产时,我可以将指纹从我的gem版本中删除.

我该怎么做呢?

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

Ruby on Rails中,如何将gem内部方法替换为长尾关键词?

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

当我运行bundle exec rake资产时:precompile我得到:

未定义的方法’logger =’用于#< Sprockets :: Environment:0x1315b040>

因此,在我看来,整个类都会以某种方式被覆盖(这会丢失它,以及其他方法),而不是仅仅覆盖一个方法.

如果我将这段代码直接包含在使用两个宝石的应用程序的rakefile中,那么事情就可以完美地运行.

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

autoload :Base, "sprockets/base"

重要的是,这不会加载代码.它只是告诉Ruby,如果/遇到一个名为“Sprockets :: Base”的未定义常量,则从指定文件加载它.您的补丁定义Sprockets :: Base,然后在任何地方调用它,从而阻止加载原始文件.

当您将补丁移动到Rakefile时,Rails中的某些东西已经引用了Sprockets :: Base,加载了原始代码.然后你的补丁干净利落地放在上面.

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

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

通过首先引用该类,您应该强制Ruby加载原始类.然后你可以安全地开展覆盖其中一种方法的业务.