LoginSignup
0
0

More than 3 years have passed since last update.

carrierwave+rails6でTypeError (no implicit conversion of nil into String)エラーが発生したときの対処方法

Posted at

執筆背景

carrierwave+rails6で画像と音声の複数アップロード機能を実装して試しに動作チェックしたところ、no implicit conversion of nil into Stringエラーが発生し、アップロードできなくなる事案が発生した。

今回はこれについての対処方法について執筆していきたいと思う。
なお、今回使用しているrailsのバージョンは6.0.2.2です。

結論

このエラーは、アップローダーのfilenameメソッドが正しく機能しないときに起こるエラーです。
filenameメソッドが正しく機能しない原因としては、

・ ファイルが正しく添付されていない
・ 読み込まれていない

などが挙げられます。

対処方法としては、

filenameメソッドの中身の後ろに
if original_filename.present?
を追記することでファイルの存在が確認できる場合にのみfileメソッドの中身が動作するように設定する

ことで解決できました。

image_uploader.rb
def filename
super.chomp(File.extname(super)) + '.jpg' if original_filename.present?
end

作業内容

現在以下の画像のようなアップロード機能をcarrierwave+rails6で実装している。
スクリーンショット 2020-03-31 14.08.25.png

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'

に問題が発生しているみたいなので確認してみる。

image_uploader.rb
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?
を追記した。

image_uploader.rb
def filename
  super.chomp(File.extname(super)) + '.jpg' if original_filename.present?
end

その結果…エラーが出なくなりました!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0