patorashのブログ

方向性はまだない

Railsでfavicon.icoがないと言われるケースへの対応

時々発生していた原因不明のfavicon.icoがないと言われるケース…。favicon_link_tagは使っているのでおかしい!と思いつつ、いつか調べようと思っていたら、Seleniumがめちゃくちゃ大量のエラーを出し始めたので慌てて調査開始。

favicon_link_tag について

favicon_link_tagは、デフォルトでassets/images/favicon.icoへのリンクのタグを出力してくれます。

= favicon_link_tag 'favicon.ico'
# => <link rel="shortcut icon" type="image/x-icon" href="/assets/favicon-e39264162177729871fd43ea8f0e1f5837b384c20c1af34f6b41c7b40dbdc210.ico" />

この最初の引数を/favicon.icoにすると、public/favicon.icoに対するパスになるようです。

= favicon_link_tag '/favicon.ico'
# => <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />

これは知らなかった。

pumaがfavicon.icoを出力しない

とりあえず、Seleniumが吐いているエラーログである、http://localhost:3000/favicon.icofaviconが取れるようにしようと思い、public/favicon.icofaviconを置いたところ、pumaのエラーが発生。

Read error: #<TypeError: no implicit conversion of Symbol into String>

puma faviconとかでぐぐったりもしたのですが、あまりいい情報が出ないので落ち着いて先のエラーメッセージとpumaでググり直してみると、出てきました。

medium.com

config.public_file_server.headersのkeyがSymbolじゃなくてStringでないといけない、とのこと。 確認してみたら、Symbolになってました😱

環境毎のconfigファイルを編集

config/environments/development.rbとtest.rbを修正しました。

# NG😵
config.public_file_server.headers = {
  "Cache-Control": "public, max-age=#{2.days.to_i}",
}

# OK😄
config.public_file_server.headers = {
  "Cache-Control" => "public, max-age=#{2.days.to_i}",
}

無事にhttp://localhost:3000/favicon.icofaviconが取れるようになりました!🎉🎉🎉