5

URL が CSV または JSON で終わる場合、レポートがその形式で生成されるように、Rails 呼び出し「respond_to」を使用してさまざまな形式で表示される一連のレポートがあります。

レポートを取りやすくするためにダウンロードボタンを作ってほしいという要望がありましたが、レポートには日付範囲などのカスタマイズがあるため、フォームを 1 つ送信し、フォームで応答形式を指定できるようにする必要があります。これは可能ですか?どうすればそれができますか?

フォームコード:

<%= form_tag('', method: 'get') do %>
    <%= hidden_field_tag('s',params[:s]) %>
    <%= select_tag "date_interval", options_from_collection_for_select(Admin::ReportController::DATE_INTERVALS.to_a, 'first', 'last') %>
    <%= label_tag('start_at','Start at') %> <%= text_field_tag('start_at', @start_at, class: 'datetimeselect') %>
    <%= label_tag('end_at','End at') %> <%= text_field_tag('end_at', @end_at, class: 'datetimeselect') %>
    <script>
        $('.datetimeselect').datetimepicker({format: "Y-m-d H O"});
    </script>
    <%= button_tag( 'HTML', :value => 'html', :name => 'run' ) %>
    <%= button_tag( 'CSV', :value => 'csv', :name => 'run' ) %>
    <%= button_tag( 'JSON', :value => 'json', :name => 'run' ) %>
<% end %>

上記の 3 つのボタン タグに注意してください。値はフォーマットであり、パラメータ「run」はルートベースのフォーマットをオーバーライドするために使用されます。

応答コード (コントローラーでレポートが生成された後に実行):

  def format_results
    respond_to do |format|
      format.html {
        # default render of HTML table
      }
      format.json {
        render json: { results: @results[:results], header: @results[:header], name: @results[:name], stats: { rows: @results.count } }, layout: false
      }
      format.csv {
        render text: report_to_csv( @results ), content_type: 'text/csv', layout: false
      }
    end
  end

URL で拡張子を指定すると、それが機能します。探しているのは、上記の「実行」という名前のボタンのボタン値を使用してオーバーライドする方法です。

前もって感謝します!

4

1 に答える 1