2009-07-24 19 views
1

私はActiveResourceの問題を解決するために少し苦労しています。ホスト名がActiveResource要求を解決したが、他の側に情報を返すサーバーがない場合、ActiveResourceのタイムアウト値動作しません。リクエストはちょうどハングアップします。Railsクラスのオーバーライド/変更(ActiveResource)

ActiveResourceコードを確認した後、これは、基本となるNet:Httpオブジェクトにタイムアウト値が1つだけ設定されているためです(read_timeout)。 Net:Httpライブラリは、これを「1ブロック(1回のread(2)呼び出しで読み込むまで待つ秒数」と定義しています。 Net:Http libには、別のタイムアウト値open_timeoutも定義されています。これは、「接続が開かれるまで待機する秒数」として定義されています。

なぜopen_timeoutがデフォルトでは設定されていないのですか?ActiveResourceクラスに設定されたタイムアウト値で、OpenResource :: Connectionクラスを変更してhttpオブジェクトにopen_timeoutを含めると、問題は解決しました。

私は自分のプロジェクトで実際にこの修正を加える最良の方法がわからないので、私は私の宝石のディレクトリのコードを変更するだけではありません。レールプロジェクトでこれらの変更を行う適切な方法はありますか?私は、/ vendorフォルダからrailsクラスをロードすることが可能であることを見てきましたが、それらはすべて動作するためにそこになければなりませんか?私は、ActiveResource :: BaseクラスとActiveResource :: Connectionクラスのサブクラスを作成し始めましたが、Net:Httpインスタンスを作成する関数がプライベートなので、これを行う簡単な方法があるようでした。

答えて

3

まず第一に、これはあなたがRailsのバグトラッカーに報告しなければならない問題である。 https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/

私はこれらのようなマイナーなものを、修正プログラムする必要があるとき、私は通常、RAILS_ROOT/configに/初期化子で初期化ファイルを作成し、再度開きます私が修正しようとしているクラスです。

class ActiveResource::Base 
    # your fix goes here 
end 

これはサルパッチと呼ばれ、多少議論の余地があります。しかし私は個人的には、コードに意味的な意味を持たない継承階層に新しいレベルを導入することは非常に残酷だと考えています。

+0

助けてくれてありがとう - それは私が欲しかったものです! – Ben

+0

彼らの方法で - 私はなぜこれが正確に機能するのか興味がありますか?私が初期化子クラスでオーバーライドしているメソッドは、ActiveResource :: Connectionクラスのプライベートメソッドですが、これはw/outの問題で動作するようです。イニシャライザフォルダ内のファイルがコアのレールクラスにどのように影響するかについての情報はほとんど見つかりません。 – Ben

+0

イニシャライザファイルは特別なものではありません。そのコンテンツは、環境がロードされた後に実行されます。 Rubyでは、クラスを再オープンしたり、プライベートな部分を使ったりすることはありません。メソッドの可視性は、Rubyのかなり浅い概念です。たとえば、obj.send(:private_method、...)を使用してオブジェクトのプライベートメソッドを呼び出すことができます – flitzwald

関連する問題