undefined方法`hashtag_url'对于`Module'

时间:2013-05-24 13:33:07

标签: ruby-on-rails ruby methods override

我在StackOverflow和谷歌中寻找了很多东西,但我无法找到解决问题的方法。我试图从Twitter文本gem中覆盖一个方法,但我认为它比这更复杂一点。

我编辑了Twitter文本gem,并在我的项目中创建了一个新的gem。在这个新的gem中,我改变了一些事情,并在Autolink模块中添加了一个名为“hashtag_url”的方法。

def hashtag_url(hashtagName) 

end 

我称之为“hashtag_url”的方法就是这个(这个方法也在gem上):

def link_to_hashtag(entity, chars, options = {})
    (...)

     href = hashtag_url(hashtag)
end

Hashtag_url是空白的,因为我需要访问我的数据库,因此,我只是在Twitter :: Autolink模块中声明了这个方法,并希望在我的项目中覆盖此方法。现在,让我们来看看我的项目代码。我从stackoverflow问题中得到了一些提示,我得到了这个结果:

/lib/ritter.rb(只是一种测试方法)

require 'ritter'

Twitter::Autolink::ClassMethods.module_eval do
    def hashtag_url(hashtagName)
        puts "I think I can't do that..."
        if hashtag = Hashtag.find_by_name(hashtagName)
            puts "I'm ok guys!"
            return "http://localhost:3000/hashtags/#{hashtag.slug}"
        end
    end
end

当我尝试检查方法是否被覆盖时,我在Rails控制台中使用它:

Twitter::Autolink.method(:hashtag_url).source_location

我得到了:

NameError: undefined method `hashtag_url' for class `Module'
    from (irb):1:in `method'
    from (irb):1
    from /usr/lib/ruby/gems/1.9.1/gems/railties-3.2.3/lib/rails/commands/console.rb:47:in `start'
    from /usr/lib/ruby/gems/1.9.1/gems/railties-3.2.3/lib/rails/commands/console.rb:8:in `start'
    from /usr/lib/ruby/gems/1.9.1/gems/railties-3.2.3/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'
P.S:我没有在任何地方打电话,要求或包含“Ritter.rb”,我需要这样做吗?我的Ritter.rb在正确的路径上,这里面的代码是对的吗?我该如何解决这个问题?

如果有必要,我可以更多地讨论为什么我需要数据库。谢谢,欢迎任何评论和回答!

1 个答案:

答案 0 :(得分:2)

如果您要向Twitter::Autolink添加方法,请直接在module_eval上致电Twitter::Autolink

Twitter::Autolink.module_eval do 
  # ..
end