0

多数の csv ファイルを含むフォルダーがあり、ユーザーが必要なものをダウンロードできるようにしたいと考えています。唯一の問題は、新しいファイルが毎日作成されるため、ファイル名をハードコードすることはできないということです。ビューからコントローラーにパラメーターを何らかの方法で渡して、要求されたファイルのダウンロードを許可することが可能かどうか疑問に思っていますが、何も機能していないようです...

コントローラ:

def download_file(file_to_download)
  send_file RAILS_ROOT + "/public/csv/" + file_to_download,
    :type => 'text/csv; charset=iso-8859-1; header=present',
    :disposition => "attachment; filename=#{file_to_download}",
    :stream => true,
    :buffer_size => 4096
end

ビュー: (haml を使用)

%h1 Database Export
%h2 Date: #{Date.today}
%table
  %tr
    %td Click on a file to download
    - @files = Dir.glob("public/csv/*.csv")
    - for file in @files
      - name = File.basename(file, '.csv')
      %tr
        %td= link_to name, :controller => "csv_exports", :action => "download_file", :file_to_download => name + ".csv"

エラーが表示されます: 引数の数が間違っています (1 に対して 0)

ただし、私の要求パラメーターは、使用したいものを渡しているようです: {"file_to_download"=>"property_site_views_07-12-2012.csv"}

ご協力いただきありがとうございます!!!

4

1 に答える 1

0

Rails コントローラーのメソッドは、パラメーターを受け取ることは想定されていません。

params オプションを使用してリクエスト パラメータにアクセスする必要があります。

def download_file
  file_to_download = params[:file_to_download]
  send_file RAILS_ROOT + "/public/csv/" + file_to_download,
    :type => 'text/csv; charset=iso-8859-1; header=present',
    :disposition => "attachment; filename=#{file_to_download}",
    :stream => true,
    :buffer_size => 4096
end

ただし、このようにユーザーが送信した値を渡すことは、インジェクションを許可するため、悪い習慣と見なされます。送信されたファイル名が実際にその特定のディレクトリ内のファイルのリストに含まれているかどうかを検証する必要があります。

コントローラーの詳細については、ガイドをご覧ください: http://guides.rubyonrails.org/action_controller_overview.html

于 2012-07-12T19:58:18.623 に答える