Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails3:如何覆盖/重新打开Gem中的类以及Rails初始化过程_Ruby On Rails_Ruby_Ruby On Rails 3_Overriding - Fatal编程技术网

Ruby on rails Rails3:如何覆盖/重新打开Gem中的类以及Rails初始化过程

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 })

我的问题和这个很相似:。然而,这个问题已经有将近一年的历史了,选择的解决方案并不是最干净的,至少对我来说不是

提供答案的人提出了3条建议。第一个建议被选为答案,但我真的很想知道如何用第二种方法来做

我需要重写由Gem定义的类的实例方法。更具体地说,这是最重要的。问题是Deave不尊重非标准主键名称。它总是使用
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"]
    
  • 然而,这似乎并不奏效。它仍然使用Gem源代码中定义的相同代码。因此,我有两个问题希望能得到回答:

    问题
  • 我做错了什么
  • Rails是在Gems之前加载在
    config.autoload\u path
    中定义的路径的文件,还是相反
  • 提前谢谢你的帮助

    lib/warden/session_serializer.rb
    模块管理员
    类会话序列化程序
    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"]