Ruby on rails Rails3:如何覆盖/重新打开Gem中的类以及Rails初始化过程
我的问题和这个很相似:。然而,这个问题已经有将近一年的历史了,选择的解决方案并不是最干净的,至少对我来说不是 提供答案的人提出了3条建议。第一个建议被选为答案,但我真的很想知道如何用第二种方法来做 我需要重写由Gem定义的类的实例方法。更具体地说,这是最重要的。问题是Deave不尊重非标准主键名称。它总是使用Ruby on rails Rails3:如何覆盖/重新打开Gem中的类以及Rails初始化过程,ruby-on-rails,ruby,ruby-on-rails-3,overriding,Ruby On Rails,Ruby,Ruby On Rails 3,Overriding,我的问题和这个很相似:。然而,这个问题已经有将近一年的历史了,选择的解决方案并不是最干净的,至少对我来说不是 提供答案的人提出了3条建议。第一个建议被选为答案,但我真的很想知道如何用第二种方法来做 我需要重写由Gem定义的类的实例方法。更具体地说,这是最重要的。问题是Deave不尊重非标准主键名称。它总是使用id。您可以看到,在中,它使用以下方法通过ID查找模型: klass.constantize.find(:first, :conditions => { :id => id })
id
。您可以看到,在中,它使用以下方法通过ID查找模型:
klass.constantize.find(:first, :conditions => { :id => id })
在我的例子中,我的id
列的名称是application\u user\u id
,因此很明显这不起作用。Desive在1.1.3中解决了这个问题,但是,我不能使用1.1.3,因为Desive LDAP可验证插件不支持1.1.3
这就是我所做的。首先我要提到的是,我通过直接编辑Gem源代码测试了这个修复程序,所以现在我只想将它转移到我的项目中
lib/warden/
中创建了session\u serializer.rb
文件(即lib/warden/session\u serializer.rb
),重新打开warden::SessionSerializer
类,并重新定义了反序列化方法
application.rb
以在config.autoload\u路径中包含lib/
config.autoload_paths += ["#{config.root}/lib"]
config.autoload\u path
中定义的路径的文件,还是相反模块管理员
类会话序列化程序
def反序列化(密钥)
klass,id=keys
如果klass.is_a?(类)
raise“设计更改了在会话中存储对象的方式。如果您看到此消息,您是否已阅读:
?我会在初始化器
目录中创建一个名为warden.rb
的文件,并将monkey补丁代码放入该文件中。我经常在我的项目中使用这种技术来修补一块宝石
要将修补程序放在lib目录下,请执行以下操作:
config.autoload_paths += ["#{config.root}/lib/warden"]
PS:我知道您已经尝试过了,但您的路径似乎不正确
PPS要了解Rails 2.3加载顺序,请参阅。感谢您的帮助!我确实读过这篇文章,但它没有任何关于config.autoload\u路径的内容。我承认我关于初始化的问题是模棱两可的,但它更像是为后续问题奠定了基础:Gems是在lib
之前加载的吗?这意味着:何时加载config.autoload\u路径中的文件?如果我应用一些逻辑,似乎lib
是在Gems之前加载的,因为我没有看到我的补丁生效。也可能是我的config.autoload_路径
错误,或者我的lib
布局和模块/类定义不符合Rails约定,无法启用自动加载。不过,感谢您的帮助。我将更新我的初始化问题以使其更清晰。是的,但您似乎已确定使用自动加载路径作为解决方案,并且正在尝试使其生效。我希望传达的是,Rails初始化时有一种有序的、有文档记录的方式。在这一过程中,如果你愿意,你会得到一定程度的“安全”保证。如果你想知道什么时候被加载,只需把你的一颗宝石和一个初始值设定项放进去,这样你就能看到它们什么时候被加载。谢谢Kandada!这是我的后袋解决方案。我知道这会起作用——这是在我链接的原始问题中——但在这些事情上,我有点固执。如果结果证明我想做的事做不到,我会给你解决办法。:)更新了我的答案看一看。哇,这肯定是我自动加载路径中的一个输入错误!正如你上面所说的那样。让我更新一下。对不起,那是我的错。它只是lib
。我应该解释为什么我只指定lib
而不指定lib/warden
。实际上我问了一个关于Rails自动加载机制的问题。基本上,只要模块/类定义正确,我就不必指定lib/warden
。所以可能它们没有?在config.autload\u路径中缺少o
config.autoload_paths += ["#{config.root}/lib/warden"]