railsのGravatarで表示するデフォルト画像を変更する

#いきさつ
Railsのチュートリアルを進めていた時に、Gravatarを用いてユーザのプロフィール画像を設定していました。その際、
「デフォルト画像をもう少しオシャレにできないものか」
と思ったので、Gravatarのデフォルト画像変更方法について調べました。
ちなみにデフォルト画像は以下の通りです。
![00000000000000000000000000000000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452125/7f26d9c5-404e-9903-3ad8-74601445b312.jpeg)

#Gravatarとは
画像をアップロードし、指定したメールアドレスと画像を関連づけることができる無料のサービスです。
チュートリアルでは、ユーザの画像を指定をするコードは以下の通りになっていると思います。

```title:users_helper.rb
def gravatar_for(user, options = { size: 80 })
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    size = options[:size]
    gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}"
    image_tag(gravatar_url, alt: user.name, class: "gravatar")
end
```
それぞれのユーザの画像は、表示する画像のURLを指定するgravatar_urlに依存します。
#gravatar_urlのパラメータ
今の段階では、表示する画像のURLとして
```https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}```
が指定されています。
このパスの指定に何かヒントがありそうです。公式サイトにあった[こちら](https://ja.gravatar.com/site/implement/images/)の記事によると、
>If you'd prefer to use your own default image (perhaps your logo, a funny face, whatever), then you can easily do so by supplying the URL to an image in the d= or default= parameter. The URL should be URL-encoded to ensure that it carries across correctly, for example:\<img src="https://www.gravatar.com/avatar/00000000000000000000000000000000?d=https%3A%2F%2Fexample.com%2Fimages%2Favatar.jpg" />


とのこと。つまり、URLのdまたはdefaultというパラメータに設定したいパスを指定することで、任意の画像をデフォルト画像に指定できるとのこと。
ただし、以下の制約があります。
>MUST be publicly available (e.g. cannot be on an intranet, on a local development machine, behind HTTP Auth or some other firewall etc). Default images are passed through a security scan to avoid malicious content.
MUST be accessible via HTTP or HTTPS on the standard ports, 80 and 443, respectively.
MUST have a recognizable image extension (jpg, jpeg, gif, png)
MUST NOT include a querystring (if it does, it will be ignored)

- 誰もがアクセス可能な画像であること（公開範囲を限定している画像やローカル環境にある画像はNG）。
- HTTP, HTTPSのポート番号がそれぞれ80番、443番であること。
- 拡張子がjpg, jpeg, gif, pngのいずれかであること。
- パスにURLパラメータを用いないこと。
だそうです。

#実際にやってみる

現段階では、ユーザの一覧画面は以下の通りです。
![スクリーンショット 2020-03-19 12.24.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452125/be7e2626-9159-567e-551b-d693148b588a.png)
デフォルト画像として、先ほどお見せした水色の画像が設定されています。
[こちら](https://ja.gravatar.com/site/implement/images/)の記事によると、例えばdのパラメータにrobohashを指定すると、以下のようなロボットの画像がデフォルト画像になるようです。
![00000000000000000000000000000000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452125/ed32e77b-f19d-4ff3-af13-b32592bea5d8.png)
実際にuser_helpers.rbを以下のように変更します。gravatar_urlのdにrobohashを設定しました。

```title:users_helper.rb
def gravatar_for(user, options = { size: 80 })
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    size = options[:size]
    gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?d=robohash&?s=#{size}"
    image_tag(gravatar_url, alt: user.name, class: "gravatar")
end
```

すると
![スクリーンショット 2020-03-19 12.27.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452125/324dd495-97de-9957-b3de-bbbe5937cf9e.png)
確かにデフォルオ画像がロボットになりましたね。
別の画像も試してみます。参考文献の記載にしたがって、次はdにretroを指定します。

```
gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?d=retro&?s=#{size}"
```

![スクリーンショット 2020-03-19 12.32.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452125/c36a80c7-e173-bd5f-6380-80d4c8e7c043.png)
デフォルト画像がドット絵になりました。
最後に、[こちら](https://resizer6.myct.jp/img/79313116268/otaku_winter.png)の画像を試してみます(特に悪意はありません)。
![otaku_winter (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452125/94d80ed5-ec95-437c-a693-ee19f080458a.png)
dに画像のURLを指定します。

```
gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?d=https://resizer6.myct.jp/img/79313116268/otaku_winter.png&?s=#{size}"
```
![スクリーンショット 2020-03-19 12.38.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452125/8fae8a2a-fc93-d344-ade8-a0bdfb1304a8.png)
こちらもできました。

#まとめ
Gravatarのデフォルト画像は、dというパラメータに画像のパスを指定することで変更することができます。

#参考文献
https://ja.gravatar.com/site/implement/images/