我在我的rails应用程序中使用了一个gem,并且有一种我想要覆盖的方法。 gam是authlogic,我要覆盖的具体方法是find_by_smart_case_login_field(login)。
我使用以下代码在lib/modules
中创建了一个文件:
# lib/modules/login.rb
module Authlogic
module ActsAsAuthentic
module Login
module Config
def find_by_smart_case_login_field(login)
login = login.downcase unless validates_uniqueness_of_login_field_options[:case_sensitive]
if login_field
where({ login_field.to_sym => login })
else
where({ email_field.to_sym => login })
end
end
end
end
end
end
但这没有做任何事情。有谁知道如何覆盖上述方法?
答案 0 :(得分:1)
嗯,你是猴子修补宝石。不错,只是不要滥用它:)
在进行猴子修补之前,您需要做两件事。
将/lib
添加到自动加载路径,否则Rails不知道。
在config/application.rb
中,找到autoload_path
行,将其更改为
config.autoload_paths += %W(#{config.root}/extras #{config.root}/lib)
在应用加载时需要自定义模块。
在config/initializers
中,添加自定义文件application.rb
,然后添加以下行
require 'modules/login.rb'
# Pay attention: No "lib/" before the file path
现在,获利!
对于模块路径,只要文件中的模块嵌套正确就无所谓。
答案 1 :(得分:0)
我在这里走出困境,但我的猜测是,你必须将文件命名为
lib/authlogic/acts_as_authentic/login/config.rb
换句话说,我认为路径必须映射到模块结构。