私は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インスタンスを作成する関数がプライベートなので、これを行う簡単な方法があるようでした。
助けてくれてありがとう - それは私が欲しかったものです! – Ben
彼らの方法で - 私はなぜこれが正確に機能するのか興味がありますか?私が初期化子クラスでオーバーライドしているメソッドは、ActiveResource :: Connectionクラスのプライベートメソッドですが、これはw/outの問題で動作するようです。イニシャライザフォルダ内のファイルがコアのレールクラスにどのように影響するかについての情報はほとんど見つかりません。 – Ben
イニシャライザファイルは特別なものではありません。そのコンテンツは、環境がロードされた後に実行されます。 Rubyでは、クラスを再オープンしたり、プライベートな部分を使ったりすることはありません。メソッドの可視性は、Rubyのかなり浅い概念です。たとえば、obj.send(:private_method、...)を使用してオブジェクトのプライベートメソッドを呼び出すことができます – flitzwald