覆盖模块中的方法

时间:2013-07-01 18:59:21

标签: ruby-on-rails ruby

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

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

2 个答案:

答案 0 :(得分:1)

嗯,你是猴子修补宝石。不错,只是不要滥用它:)

在进行猴子修补之前,您需要做两件事。

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

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

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

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

    require 'modules/login.rb'
    # Pay attention: No "lib/" before the file path
    
  3. 现在,获利!

    对于模块路径,只要文件中的模块嵌套正确就无所谓。

答案 1 :(得分:0)

我在这里走出困境,但我的猜测是,你必须将文件命名为

lib/authlogic/acts_as_authentic/login/config.rb

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

相关问题