Help us understand the problem. What is going on with this article?

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

執筆背景

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

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

hasegawa-naoto
最近取り組んでること: ウーバーイーツ、筋トレ/ 趣味: 作詞作曲、ギター、カラオケ、音楽鑑賞、Netflixで映画/アニメ鑑賞、登山、旅行/ 一言: アイデアを形にできるって素晴らしいなって思う
https://yuyakezora.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした