curl local:3000 -Iv
* About to connect() to local port 3000 (#0)
* Trying 127.0.0.1... connected
> HEAD / HTTP/1.1
> User-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: l:3000
> Accept: */*
В заголовке "Accept" браузер передает MIME типы, того что он хочет принять. Правда еще может передаваться формат и в url. Рельса на этой основе выбирает как ей ответить. Там все просто, никаких сложных алгоритмов. Но не помню точно как.
В respond_to сверху вниз пробегает доступные форматы пытаясь отдать нужный, либо по соглашению выбирает файл.
Можете сделать тестовый экшн и поэкспериментировать. Заголовки и форматы будут доступны в дебагере.