#執筆背景
carrierwave+rails6で画像と音声の複数アップロード機能を実装して試しに動作チェックしたところ、no implicit conversion of nil into Stringエラーが発生し、アップロードできなくなる事案が発生した。
今回はこれについての対処方法について執筆していきたいと思う。
なお、今回使用しているrailsのバージョンは6.0.2.2です。
#結論
このエラーは、アップローダーのfilenameメソッドが正しく機能しないときに起こるエラーです。
filenameメソッドが正しく機能しない原因としては、
・ ファイルが正しく添付されていない
・ 読み込まれていない
などが挙げられます。
対処方法としては、
filenameメソッドの中身の後ろに
if original_filename.present?
を追記することでファイルの存在が確認できる場合にのみfileメソッドの中身が動作するように設定する
ことで解決できました。
def filename
super.chomp(File.extname(super)) + '.jpg' if original_filename.present?
end
#作業内容
現在以下の画像のようなアップロード機能をcarrierwave+rails6で実装している。
image1のみに画像を添付し、送信ボタンを押すと、以下のエラーが発生。
TypeError (no implicit conversion of nil into String):
app/uploaders/image_uploader.rb:33:in `extname'
app/uploaders/image_uploader.rb:33:in `filename'
app/controllers/characters_controller.rb:30:in `block in create'
app/controllers/characters_controller.rb:29:in `create'
app/uploaders/image_uploader.rb:33:in extname' app/uploaders/image_uploader.rb:33:in
filename'
に問題が発生しているみたいなので確認してみる。
def filename
super.chomp(File.extname(super)) + '.jpg'
end
このメソッドはgem carrierwaveでgem rmagick(画像サイズを変換したり画像の拡張子を揃えるためのライブラリ)を使用するときに、必要なメソッドです。
公式マニュアル → https://github.com/carrierwaveuploader/carrierwave/blob/master/README.md
実は、今回実装したimage1~image4には、共通のアップローダー(image_uploader.rb)を使用するように設定していた。
エラー発生時にはimage1のみに画像をしていたため、
残りのimage2~image4は画像が添付されていないという認識になり、filenameメソッドが正しく動作しなくなったため、エラーが発生した
と考えた。
なので、filenameメソッドの中身の後ろにファイルの存在を確認する
if original_filename.present?
を追記した。
def filename
super.chomp(File.extname(super)) + '.jpg' if original_filename.present?
end
その結果…エラーが出なくなりました!!