BitArts Blog

ロードバイク通勤のRubyプログラマで伊豆ダイバー。の個人的なブログ。

Railsでrespond_toとか使う時にはデフォルトformatを指定しなきゃだめ

( ..)φメモメモ

FacebookのOGPのメタデータを収集するクローラは、Accept: */*でリクエストを送ってくるようだ。普通のWebブラウザではAccept: text/htmlが入ると思うけど、これを前提にした実装になっているとクローラに対してWebアプリが正しいHTMLを返さず、OGPを拾ってくれない場合がある。

トップページだけOGPが反映されなくてかなり悩んだ。このページはRailsでURLの拡張子に応じてHTMLとRSSを出し分けるように実装していた。

class TopController < ApplicationController
  def index
    respond_to do |format|
      format.rss { render layout: false }
      format.html { render }
    end
  end
end

respond_toとかを使う際には、routes.rbのdefaultsオプションでデフォルトのformatを必ず指定するようにしよう。

root to: 'top#index', defaults: { format: :html }

あるいはコントローラでこうしちゃうか。(よくないかも)

class ApplicationController < ActionController::Base
  before_filter :default_request_format
  def default_request_format
    request.format = :html if request.format == '*/*'
  end
end