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.