Ruby on rails 重写特定rails环境的lib模块方法

Ruby on rails 重写特定rails环境的lib模块方法,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个库模块,我想根据我运行的rails环境重写它 模块位于lib/package/my_Module.rb中: module Package module MyModule puts "Defining original module" def foo puts "This is the original foo" end end end 我已经能够使用以下信息部分解决问题:具体来说,在我的环境/dev_stub.rb中: Package::My

我有一个库模块,我想根据我运行的rails环境重写它

模块位于lib/package/my_Module.rb中:

module Package
  module MyModule
    puts "Defining original module"
    def foo
      puts "This is the original foo"
    end
  end
end
我已经能够使用以下信息部分解决问题:具体来说,在我的环境/dev_stub.rb中:

Package::MyModule.module_eval do
 puts "Defining override"
 def foo
   puts "This is foo override"
 end
end
(当rails试图查找与包相关的其他类时,该链接上的另一个解决方案似乎会导致错误)

现在,这似乎把我带到了那里,而且如果我设置

config.cache_classes = true
…但我想将其用作存根开发环境,对于开发环境,关于此值的注释建议使用false。。。在这种情况下,覆盖仅在第一次包含模块时起作用,并且在随后的任何时间,它使用原始模块

我的问题:我这样做对吗?我可以修改lib模块本身,使其基于RAILS_ENV有条件地重写,但我希望它更干净

编辑

我的用例是从控制器函数引用它。如果我有

class SomethingController < ApplicationController
  def show
    Package::MyModule.foo
  end
end

我最初这样做的问题是Rails不再自动查找我的lib目录中的所有内容,我需要在所有其他lib文件(以及引用lib的控制器)中散布“require”语句,以覆盖它们的所有依赖项。虽然这一切都完成了,但它确实有效,但它也具有与
config.cache_classes=true
类似的效果,因为所有的lib类都不会在更改时重新加载,即使在我的常规开发环境中,没有猴子补丁(因为添加了所有“require”语句).

您可以简单地重写模块及其实例,而无需
module\u eval

我猜你的模块是作为一个Mixin包含的,它的方法不受你的monkey补丁的影响

这就是
alias\u method\u chain
起作用的地方


查看以了解如何使用它来满足您的需要。

您可以简单地覆盖模块及其实例,而无需
模块评估

我猜你的模块是作为一个Mixin包含的,它的方法不受你的monkey补丁的影响

这就是
alias\u method\u chain
起作用的地方


查看如何使用它来满足您的需要。

在dev_stub.rb中设置
config.cache\u classes=true
,并使用
module\u eval
来定义问题中描述的补丁,这似乎是实现目标的方法——为一个模块创建一个不影响其他模块的特定于环境的补丁代码路径和Rails类加载行为中的环境。

在dev_stub.rb中设置
config.cache_classes=true
,并使用
module_eval
来定义问题中描述的补丁,这似乎是实现目标的方法——为一个模块创建一个不影响其他模块的特定于环境的补丁代码路径和Rails类加载行为中的环境。

我实际上在没有使用module_eval的情况下尝试了它,但Rails中的某些东西不喜欢这样,这会导致在尝试使用其他库代码时找不到定义。我将我的模块用作Mixin,尽管我要重写的方法也在同一个模块中,所以我不确定alias_method_chain在这里是否有用。只需通过简单的重新定义重试重写模块方法,就可以了。在这方面我帮不了你更多的忙。我正在运行一个旧版本的Rails(2.3.8),所以也许这与此有关?我不这么认为。无论Rails版本是什么,这都是纯粹的ruby。我编辑了我的问题,以提供更多关于Rails上下文的详细信息,以及为什么修补程序只在第一次工作。我实际上在没有使用module_eval的情况下尝试过它,但Rails中的某些东西不喜欢它,这会导致在尝试使用其他库代码时找不到定义。我将我的模块用作Mixin,尽管我要重写的方法也在同一个模块中,所以我不确定alias_method_chain在这里是否有用。只需通过简单的重新定义重试重写模块方法,就可以了。在这方面我帮不了你更多的忙。我正在运行一个旧版本的Rails(2.3.8),所以也许这与此有关?我不这么认为。无论Rails版本是什么,这都是纯粹的ruby。我编辑了我的问题,提供了更多关于Rails上下文的细节,以及为什么这个补丁只在第一次使用。
require 'package/my_module'
module Package
  module MyModule
    puts "Defining override"
    def foo
      puts "This is foo override"
    end
  end
end