2

私のアプリケーションは、Mechanize を使用してさまざまなサイトから情報をスクレイピングします。当然のことながら、各サイトにはカスタム Mechanize コードが必要です。各サイトは、スクレイピングする URL と、そのサイトの Mechanize コードを含む .rb ファイルの文字列名を含めて、私のデータベースに保存されます。この場合、スクリプトが assets フォルダーで利用可能であると仮定しましょう。

を呼び出しhttp://example.com/site/:idて、show アクションで実行する Mechanize スクリプトを動的に選択します (たとえば、@site.name + ".rb")。スクリプトはデータを共通のモデルに変換するため、すべてのサイトで同じショー テンプレートを使用できます。

アクション内で .rb スクリプトを動的にロードして結果を取得する方法が見つかりません。テンプレートに渡す前に解析できる JSON 文字列をスクリプトで返す方が簡単かもしれませんが、その解決策もわかりません。理想的には、スクリプトはアクションのスコープで実行されます。醜い解決策は膨大な if-else チェーン (実行するコード ブロックを決定するためにサイト名をテストする) ですが、もっと良い方法があるはずです。

データベースオブジェクトのプロパティに依存するさまざまなコードを実行するための一般的な解決策と同様に、提案は大歓迎です。

4

1 に答える 1

2

アプリにすべてのコードが既にあるのに、なぜ Ruby コードを評価するのですか?

次のようなクラスを作成します。

class GoogleSpider < Spider; end
class NewYorkTimesSpider < Spider; end
class SomeOtherSpider < Spider; end

また、サイト クラスは使用されるクラス名を保持するため、コントローラー アクションで次のようなことを簡単に行うことができます。

def show
  @site = Site.find(params[:id])
  # name contains SomeOtherSpider
  @process_output = @site.name.constantize.new.process
  # do something with the output here
end

そして、必要なクラスを呼び出すだけで、Ruby コードの評価をいじる必要はありません。それらをすべてシングルトンにすることも、アクセスを高速化するためにすべてをハッシュに保持することもできます。

于 2012-06-20T01:26:38.080 に答える