今北産業
・ここにあるようにfixture_file_upload railsを使うと良い。
・このやり方は効果がない
・Paramにファイルパスをじかに渡すとCarrierWaveが
You tried to assign a String or a Pathname to an uploader, for security reasons, this is not allowed.
と出て受け取ってくれない
経緯
CSVファイルをアップロードして、その内容をDBに登録し、データに操作をくわえて、CSVファイルを吐き出す。という業務用のCSV編集アプリをRailsでつくろうとしてました。
CarrierWaveをいれて、CSVをアップロードしてやるためにコントローラーをつくりました。
def import
@uploaded_file = CsvUploader.new
@uploaded_file.store!(params[:file])
file_path = @uploaded_file.file.file
end
こんな感じでファイルを受け入れてやって、アップロードされたファイルのパスを手に入れた後は、DBに登録させる・・・・というふうにしました。手動でやるとうまく動いてるようなのでRspecでテストを書きました。(本来テストは先に書くべきです。ただ、どう動くのかわからない状況だったため、結果を記録する意図でテストを書きます。)
post :import, params expect(CsvData.all.count).to eq(100)
paramsに直接ファイルパスを文字列で渡したところ
You tried to assign a String or a Pathname to an uploader, for security reasons, this is not allowed.
おやおやエラーが・・・じゃあ・・・stackoverflowをみて
csv_src = File.join(Rails.root, "/public/csv/test.csv")
csv_file = File.new(csv_src)
とやって文字列の代わりに渡してあげました。そしたら・・・
file_path = @uploaded_file.file.file
この箇所でNoMethodエラーが出るんですね。Pryで手動の実行結果と、テスト時の実行結果を比較してみると
@uploaded_file
内のオブジェクトが違います。どうも正確にアップロードできてないみたいです。
で、ここにあるようなやり方をしてみたところうまく行きました。
ハマってる方は御参考に。
しかしなんで動かなかったんでしょうね。
fixture_file_upload rails ってCarrierWaveのメソッドなんでしょうか?