Layouts e herança de Rails

Mais uma vez, o ponto de DHH de “Rails apenas ser Ruby” é válido quando se trata de layouts em Rails. Recentemente, consertei um bug em nosso aplicativo em que certos terminais de API tentavam renderizar o layout do nosso aplicativo em JSON. Isso estava causando alguns erros desagradáveis. Por que nossos controladores de API, que não possuem nenhum layout associado a eles, estão tentando renderizar um layout?

Aqui está um breve exemplo que mostra a situação:

class ApplicationController < ActionController::Base
layout
'application'
end

class API::SomeController < ApplicationController
end

Notou alguma coisa? Há um “pegadinho” aqui. O controlador de API tentará renderizar o ‘aplicativo’ de layout. Por quê? Como o controlador de API herda do Controlador de aplicativo, o layout especificado no nível do controlador de aplicativo tentará ser definido em cada uma das ações do controlador de API devido à herança. Estranho, mas faz sentido. A solução era simplesmente eliminar qualquer configuração de layout no nível do controlador de aplicativo e mantê-la no nível do controlador individual.

Lição aprendida: tome cuidado com o que você define no nível do controlador de aplicativo.