Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Railsで:formats=>["image/*"]でActionView::MissingTemplateエラーが発生した場合の対応

More than 1 year has passed since last update.

現象

Railsで500エラーが発生し、エラーログにはActionView::MissingTemplateと書かれていました。
media/ads/show.erbは存在し、これまで問題なく表示できていたURLだったので、なぜ??となりました。

エラーログの:formats=>["image/*"]を見る限り画像のテンプレートを探しに行ってしまっているようなのですが、URLに.png.jpgなどの拡張子が付いている訳でもありませんでした。

ActionView::MissingTemplate (Missing template media/ads/show, media/application/show, application/show with {:locale=>[:ja], :formats=>["image/*"], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in:

結論

acceptヘッダーにimage/*を指定することで再現しました。
おそらく、リンク先の画像を一括ダウンロードするようなブラウザ拡張の対象URLに引っかかってしまったのだと思います。

curl '<URL>' -H 'accept: image/*;'

解決方法(方針)

画像のformatを弾く方針で考えてますが、formatが指定されている訳ではないのでできるか不明です。
対応完了したら追記します。

詳細

formatsを取得している処理はactionpackライブラリのmine_negotiation.rbに書かれていました。
(actionpack-5.0.2を使用しています。)

      def formats
        fetch_header("action_dispatch.request.formats") do |k|
          params_readable = begin
                              parameters[:format]
                            rescue ActionController::BadRequest
                              false
                            end

          v = if params_readable
            Array(Mime[parameters[:format]])
          elsif use_accept_header && valid_accept_header
            accepts
          elsif extension_format = format_from_path_extension
            [extension_format]
          elsif xhr?
            [Mime[:js]]
          else
            [Mime[:html]]
          end
          set_header k, v
        end
      end

今回、拡張子が指定されていないのでparams_readableはnilになります。
そして、HTTPリクエストのacceptヘッダーにimage/*を指定したので、use_accept_headerメソッドとvalid_accept_headerメソッドは共にtrueを返します。
結果、acceptsメソッドが呼び出され、image/*をもつMine.Typeインスタンスがformatsの結果として返されます。

yosee46
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