時々発生していた原因不明の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.ico
でfaviconが取れるようにしようと思い、public/favicon.icoにfaviconを置いたところ、pumaのエラーが発生。
Read error: #<TypeError: no implicit conversion of Symbol into String>
puma faviconとかでぐぐったりもしたのですが、あまりいい情報が出ないので落ち着いて先のエラーメッセージとpumaでググり直してみると、出てきました。
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.ico
でfaviconが取れるようになりました!🎉🎉🎉