0

StackOverflow と Google で多くのことを検索しましたが、問題の解決策が見つかりません。Twitter-text gem のメソッドをオーバーライドしようとしていますが、それよりも少し複雑だと思います。

Twitter-text gem を編集し、プロジェクトで使用する新しいものを作成しました。この新しい gem では、何かを変更し、「hashtag_url」というメソッドを Autolink モジュールに追加します。

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 Console でこれを使用します。

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>'

PS: 「Ritter.rb」を呼び出したり、要求したり、含めたりしません。これを行う必要がありますか? 私の Ritter.rb は正しいパスにあり、この中のコードは正しいですか? この問題を解決するにはどうすればよいですか?

必要に応じて、データベースが必要な理由について詳しくお話できます。ありがとう、コメントと回答は大歓迎です!

4

1 に答える 1

2

メソッドを に追加する場合は、 を直接Twitter::Autolink呼び出す必要があります。module_evalTwitter::Autolink

Twitter::Autolink.module_eval do 
  # ..
end
于 2013-05-24T16:57:20.773 に答える