ArgumentError Nil location provided. Can’t build URI. が出た時の対処法  プロフ画像の実装

ArgumentError 


前にも何回かお見かけしたエラー
その時はなんとなく解決できたが今回はとても詰まってしまったので忘れないうちに残しておく


そもそもArgumentErrorとは?

直訳すると変数のエラー Argument = 引数 と言うことを今回初めて知った(今更)

主に引数の個数が合っていない場合とか引数の中身が空とかそんな時に出るエラーらしい

詳しく内容を見ていくとTopicsのindexビューにてエラー
赤線の12行目がおかしいよ

Nil location provided. Can’t build URI.
翻訳すると

『提供された場所はありません。 URIを構築できません。』

そもそも何をしていてこんなエラーが出たかと言うと、ある場所にユーザーが登録したプロフィール画像を表示したいと思いコードを書いてました。

書いたコード

“`<% if topic.user.profile_photo == nil %>
 <%= image_tag “icons/profile-icon.png”, class:”profile_photo_mini” %> %>
<% else %>
<%= image_tag topic.user.profile_photo.url, class:”profile_photo_mini” %>
<% end %>“`

よくある簡単なif文で、もしこのトピックに対するユーザーのプロフィール画像がnilの場合はあらかじめ用意してあるテスト画像を表示
そうでない場合(この場合プロフィール画像が登録してある場合)はその登録している画像を表示する と言ったコードです。

このprofile_photo画像はユーザー登録の際にマストではないので当然登録していないユーザーもいます。 

なのでif文で逃げ道を作ったのですがどうもこのif文が思ったように機能していない。

他の方の記事を見ると、画像登録していないユーザーを消せば解決!!みたいなことが書いてありました。確かにエラーは無くなりますが、それは自分が求めている内容ではないので再び思考。

エラー内容に戻り

Nil location provided. Can’t build URI.

『提供された場所はありません。 URIを構築できません。』

んーURLかと思ったらURIなのね 
てかURIって何?

再びぐぐるとこんな記事を発見(寿司に例えてて面白い)
https://webtan.impress.co.jp/e/2010/03/09/7539
URI(Uniform Resource Identifier)といいURLより広義に使われるようです

よく考えたら違うんですが、画像の指定場所が違うのかな?とか思って確認するも問題なし。具体的に画像のパスを指定するもエラー改善せず。


おかしいなあif文の書き方も間違っていないはずなのになー

ニッチもサッチもいかなくなりメンターの方に相談。

ここから解決方法


<% if topic.user.profile_photo == nil %>


 <%= image_tag “icons/profile-icon.png”, class:”profile_photo_mini” %> %>
<% else %>
<%= image_tag topic.user.profile_photo.url, class:”profile_photo_mini” %>
<% end %>
この一行目の部分を


<% if topic.user.profile_photo.blank? %>

に書き換えることでちゃんとif文が機能するようになりました。

要は中身がnilではなくて空なのでうまくいかなかったようです。

.blank? でnilの場合と空の場合trueになります。

rails cで中身を確認したら表示はnilになっているのになんでなんだー!!
意味わからん!!と質問したら


今は深く考えなくていいです。 画像の場合は特殊な考え方ですからそう言うものだと覚えれば大丈夫です。とのこと


一応説明はしてくれたのですが僕の方の理解が追いつかず深い話ができませんでしたorz


ImageUploaderのクラスや CarrierWaveが関係しているらしいことまでは分かりました。


取り急ぎ解決しましたので参考までにぜひ!!