4

/reports/generate_report を読み込むと、Rails アプリが XML を生成します。

のページで、この XML を変数に読み込み、データベースに保存したいと考えています。

これどうやってするの?/reports/generate_report.xml URI からの応答を変数にストリーミングすることはできますか? それとも、XML は同じ Web アプリによって生成されるので、それを行うためのより良い方法はありますか?

ここに私の generate_report アクションがあります:

class ReportsController < ApplicationController
  def generate_report
    respond_to do |format|
      @products = Product.all
      format.xml { render :layout => false }
    end
  end
end

これが私が書こうとしているアクションです:

class AnotherController < ApplicationController
  def archive_current
    @output = # get XML output produced by /reports/generate_report
    # save @output to the database

    respond_to do |format|
      format.html # inform the user of success or failure
    end
  end
end

解決済み:私の解決策 (Mladen Jablanović に感謝):

@output = render_to_string(:file => 'reports/generate_report.xml.builder')

render_to_string は (ばかげて) ActionController::Base の保護されたメソッドであるため、モデル クラスで次のコードを使用して同じタスクを実行しました。

av = ActionView::Base.new(Rails::Configuration.new.view_path)
@output = av.render(:file => "reports/generate_report.xml.builder")
4

4 に答える 4

2

おそらく、XML レンダリング ロジックを同じコントローラー内の別のメソッド (おそらくプライベート メソッド) に抽出し、 を使用して XML を文字列にレンダリングし、とアクションのrender_to_string両方から呼び出すことができます。generate_reportarchive_current

于 2010-04-03T10:56:49.887 に答える
1

@output = Product.all.to_xml

于 2010-04-03T14:30:46.610 に答える
1

この種の状況で私が通常行うことは、レポートを生成するための個別のモジュール/クラス/モデルを作成することです (製品モデルで正しい可能性さえあります)。この別個のコンポーネントは にあるapp/models場合もあれば、 にある場合もありますlib。いずれにせよ、抽出したら、必要な場所で使用できます。コントローラーはそれを直接呼び出すことができます。コンソールから生成できます。cron ジョブで生成できます。これはより柔軟であるだけでなく、レポートの生成が遅くなった場合にリクエストの応答時間をスムーズにするのにも役立ちます。

テンプレートを使用しているので、コントローラ ルートが便利であることは理解できますが、補助ライブラリにある種の ruby​​ テンプレート システムを含める必要がある場合でも、おそらく面倒が少なく、より柔軟になるでしょう。コントローラ。

于 2010-04-03T06:58:23.400 に答える
0

すみません、質問は Xml についてですか、それともセッションについてですか? つまり、あなたのアクションが Xml 素材を質問に生成するという事実ですか? それとも、後で使用するためにアクションの出力を保存したいだけですか?
「別の」ページでおっしゃいましたが、別のリクエストでということですか?(ユーザーが承認した後のように?) なぜ出力を保存したいのですか? レンダリングされたとおりに保存する必要があるためですか?(たとえば、あるレポートを保存するためにクリックして別のレポートを保存した場合、ユーザーはイライラする可能性があります) または、これを生成するのにコストがかかりますか?
それとも、私はそれを間違えて、リファクタリングについてですか?

于 2010-04-03T18:31:19.377 に答える