gpt4 book ai didi

Ruby:从单独的文件向模块添加方法并自动加载它

转载 作者:太空宇宙 更新时间:2023-11-03 16:07:29 25 4
gpt4 key购买 nike

我在 Rails 应用程序中使用 Sorcery 库。它的一个模块用于外部身份验证,我需要向该模块添加一个方法。

现有代码为here ,我想从 this patch 添加 add_provider_to_user 方法.

因此,我在我的 lib/modules 目录中添加了一个文件,我已经告诉 Rails 自动加载该文件。该文件名为 sorcery_extension.rb,如下所示:

module Sorcery
module Controller
module Submodules
module External
module InstanceMethods
protected

# If user is logged, he can add all available providers into his account
def add_provider_to_user(provider)
provider_name = provider.to_sym
provider = Config.send(provider_name)
user_hash = provider.get_user_hash
config = user_class.sorcery_config

user = current_user.send(config.authentications_class.to_s.downcase.pluralize).build(config.provider_uid_attribute_name => user_hash[:uid], config.provider_attribute_name => provider)
user.save(:validate => false)

return user
end
end
end
end
end
end

这没有用。我在我的 Controller 中收到未定义方法错误(调用其他巫术方法工作正常)。

因此,我对 ruby​​ 的基本理解是您可以随时向对象或模块添加方法...我想我已经在文件中正确复制了模块的嵌套。我是否需要将模块文件命名为不同的名称?我不太确定如何做这种事情,所以非常感谢任何帮助。谢谢!

最佳答案

您的文件永远不会需要。您可以通过在控制台中键入来仔细检查:

Sorcery::Controller::Submodules::External::InstanceMethods.method_defined?(:add_provider_to_user)
# => will return false, you want true

原因是自动加载仅在常量未知时发生,在这种情况下,Rails 会尝试从不同的自动加载路径自动加载它。

您必须明确要求您的文件(例如,从初始化程序中的文件),事情会按预期工作。

关于Ruby:从单独的文件向模块添加方法并自动加载它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10375971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com