gpt4 book ai didi

ruby-on-rails - 从 lib 目录重新打开 gem 中定义的模块

转载 作者:行者123 更新时间:2023-12-03 22:40:37 25 4
gpt4 key购买 nike

我有一个看起来像这样的文件

module Devise
module Mailers
module Helpers

def initialize_from_record(record)
record = hack_record(record)
@scope_name = Devise::Mapping.find_scope!(record)
@resource = instance_variable_set("@#{devise_mapping.name}", record)
end

protected

# monkey patch :D
def hack_record(record)
record.kind_of?(Hash) ? kmodel(record).where(:email=>record.first[1]['email']).first : record
end

def kmodel(record)
record.first[0].camelize.constantize
end

end
end
end

它显然会重新打开一个 Devise 模块。如果我把它放在初始值设定项中,一切都很好。但是,如果我将它放在 lib/devise/mailers 中,它确实会被读取,但是它无法从 Devise gem 中定义的模块中找到其他方法。这是为什么?

最佳答案

这是因为它在 Devise 之前加载您的 Devise 模块。它们被命名为相同的并且放置在相同的(至少,根据加载路径)路径。

如果您想在此模块上定义新方法,那么如何完全定义一个不同的模块并将其包含到 Devise 的模块中?

lib/devise/mailers/helpers_extensions.rb

module Devise
module Mailers
module HelpersExtensions
# your code
end
end
end

Devise::Mailers::Helpers.send :include, Devise::Mailers::HelpersExtensions

关于ruby-on-rails - 从 lib 目录重新打开 gem 中定义的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8145887/

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