0

Rails form_tag フォーム ヘルパーを使用してオブジェクトを送信できません。私は次のことを試しました

Download:<%=form_tag({controller: "orders", action: "csv_downloader",format: "csv"}, method: "post") do%>
                    <%= hidden_field_tag(:data, @orders_customs_display) %>
                    <%= submit_tag ("Download CSV"),:class => "btn btn-success download" %>
                  <% end %>

ビューとコントローラーには次のものがあります

  def csv_downloader
    data=params[:data]
    respond_to do |format|
        format.csv { send_data data.to_csv }
      end
  end

ルートには次のものがあります。

  match "csv_downloader", to: "orders#csv_downloader", via: [:post]

ご覧のとおり、.to_csv は order.rb モデルで記述されたカスタム関数です。

  def self.to_csv
    CSV.generate do |csv|
      csv << column_names
      all.each do |order|
        csv << order.attributes.values_at(*column_names)
      end
    end
  end

ダウンロードしようとすると、次のエラーが表示されます。

 undefined method `to_csv' for #<String:0x0000000716f8a8>

これは本質的に、引数がオブジェクトではなく文字列として来ているということですか? これを修正するにはどうすればよいですか?

4

1 に答える 1

0

文字列やファイルは HTML フォーム経由で送信できますが、複雑なオブジェクトは送信できません。

できること: オブジェクト (マーシャル) を非表示の文字列フィールドにシリアル化し、後でコントローラーで文字列をオブジェクトに逆シリアル化します。ただし、ユーザーがシリアル化されたデータを変更できる可能性があるため、これは安全ではない可能性があります。

推奨される方法は、html ビューに対して行ったのと同じ方法でデータを再作成することですが、ビューをレンダリングするのではなく、csv ファイルを送信することです。

于 2013-11-11T10:31:00.087 に答える