0

我在我的 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

但这并没有做任何事情。有谁知道如何覆盖上述方法?

4

2 回答 2

1

好吧,你是在修补宝石的猴子。不错,只是不要滥用它:)

在使猴子修补工作之前,您需要做两件事。

  1. 添加/lib到自动加载路径,否则 Rails 不知道。

    config/application.rb中,找到该autoload_path行,将其更改为

    config.autoload_paths += %W(#{config.root}/extras #{config.root}/lib)
    
  2. 在应用加载时需要您的自定义模块。

    config/initializers中,添加一个自定义文件say application.rb,然后添加以下行

    require 'modules/login.rb'
    # Pay attention: No "lib/" before the file path
    

现在,利润!

至于模块路径,只要您的模块嵌套在文件中正确,就没有关系。

于 2013-07-01T19:12:04.443 回答
0

我在这里很危险,但我的猜测是你必须将文件命名为

lib/authlogic/acts_as_authentic/login/config.rb

换句话说,我相信路径必须映射到模块结构。

于 2013-07-01T19:03:40.817 回答