Pular para o conteúdo principal

Tipos de Controladores

O Nerdify organiza seus controladores em três tipos principais, cada um com uma responsabilidade específica e comportamento esperado. Essa divisão permite maior clareza no design da aplicação, além de garantir o reaproveitamento de lógica e renderizações específicas para cada cenário.


📦 ApplicationController

O ApplicationController é o tipo padrão e mais comum nos projetos Nerdify. Ele é responsável pelas rotas RESTful tradicionais de CRUD (Create, Read, Update, Delete). Toda a lógica padrão para essas ações já está implementada, bastando herdar dele para usufruir de toda a automatização do Nerdify.

Este tipo de controlador trata automaticamente:

  • ✅ Autenticação e autorização com base no método authenticate
  • 📥 Carregamento automático de objetos via métodos object e objects
  • 🔍 Aplicação de filtros com criteria
  • 📊 Paginação e ordenação
  • 🧱 Resposta via page_json, que monta os componentes da tela a partir do template
  • 🔐 Strong parameters via object_parameters
  • 🔁 Escopo padrão definido por default_scope

Cada action (index, show, new, edit, create, update, destroy) segue o fluxo de ciclo de vida já descrito anteriormente, incluindo suporte a rotas aninhadas e configuração dinâmica dos relacionamentos.

🛠️ Como herdar o Nerdify::ApplicationController

class Api::V1::Platform::Modules::Crm::CampaignsController < Nerdify::ApplicationController
authenticate User, auth_path: "users/sign_in"
template "nerdify/templates/admin"
end

O valor passado para template representa o caminho lógico que será convertido automaticamente em um módulo Ruby. Por exemplo:

template "nerdify/templates/admin"

irá buscar o módulo Ruby:

Nerdify::Templates::Admin

e usá-lo como base para os templates e definições da interface deste controlador. Isso permite reutilizar a mesma estrutura em múltiplos controladores, organizando melhor os componentes da aplicação.

🧭 Opções do authenticate:

  • auth_path: define a rota de redirecionamento quando o usuário não está autenticado.
  • only: [:action1, :action2]: restringe a autenticação apenas às actions listadas.
  • except: [:action1, :action2]: aplica a autenticação em todas as actions, exceto nas listadas.

🔧 Métodos sobrescrevíveis:

MétodoDescriçãoRetorno esperado
objectRetorna a instância do modelo.Instância do modelo
objectsRetorna a lista de objetos filtrada, paginada e ordenada.Mongoid::Criteria ou array de objetos
criteriaDefine os filtros a serem aplicados com base nos params.Hash de filtros
default_scopeDefine o escopo padrão da listagem (por ex: :ativos, :all).Symbol
page_jsonDefine os componentes a serem renderizados na resposta.Hash JSON com estrutura da tela
object_parametersDefine os strong params para criação/atualização (params.require(...).permit(...))Objeto ActionController::Parameters permitidos

📈 ReportsController

O ReportsController é um tipo especial de controlador usado exclusivamente para visualização de dados agregados e dashboards. Seu foco está em relatórios com filtros, agrupamentos, gráficos e listas.

Características principais:

  • ☝️ Suporta apenas a rota index
  • 🧹 Executa criteria normalmente com base nos filtros
  • 🚫 Não permite edição, criação ou exclusão de dados
  • 🧱 Utiliza page_json para montar os componentes da página
  • 📊 Ideal para visualizações com listas, tabelas, gráficos e KPIs

🛠️ Como herdar o Nerdify::ReportsController

class Api::V1::Platform::Modules::Crm::CrmReportsController < Nerdify::ReportsController
authenticate User, auth_path: "users/sign_in"
template "nerdify/templates/admin"
end

🔧 Métodos sobrescrevíveis:

MétodoDescriçãoRetorno esperado
criteriaDefine os filtros a serem aplicados com base nos params.Hash de filtros
default_scopeDefine o escopo padrão dos relatórios.Symbol
page_jsonDefine os componentes e estrutura da resposta do relatório.Hash JSON

🔐 SessionsController

O SessionsController é utilizado para lidar com todas as rotas relacionadas à autenticação da aplicação. Ele é mais completo do que aparenta inicialmente e cobre diferentes aspectos da sessão de um usuário, incluindo:

Principais funções e rotas:

  • 🔑 Login (POST /api/v1/session)
  • ❌ Logout (DELETE /api/v1/session)
  • ✅ Verificação de token (GET /api/v1/session)
  • 🔓 Tela de login (GET /api/v1/users/sign_in)
  • 🧠 Recuperação de senha (GET /api/v1/users/password/new)
  • 🔄 Alteração de senha (PUT /api/v1/users/password)
  • 📩 Confirmação de conta (GET /api/v1/users/confirmation)

Essas rotas são tratadas automaticamente pelo controlador de sessão e se integram com a autenticação JWT e devise_token_auth para emissão de tokens e gerenciamento de permissões com cancancan.

🛠️ Como herdar o Nerdify::SessionsController

class Api::V1::UsersController < Nerdify::SessionsController
authenticate User, auth_path: "users/sign_in", only: [:destroy]
template "nerdify/templates/admin"
end

🔧 Métodos sobrescrevíveis:

MétodoDescriçãoRetorno esperado
current_userRetorna o usuário autenticado da sessão.Instância de User
build_auth_headerMonta o cabeçalho de autenticação para o frontend.Hash com token e metadata
auth_responseDefine o payload retornado após login.Hash com dados do usuário e permissões
page_jsonDefine os componentes da tela de login, logout ou sessão inválida.Hash JSON

🧠 Cada tipo de controlador foi desenhado para cumprir um papel específico na arquitetura do Nerdify, aproveitando as convenções do framework para manter o código enxuto, expressivo e de fácil manutenção.

📚 Ao entender as diferenças entre ApplicationController, ReportsController e SessionsController, você poderá estruturar seu projeto com muito mais clareza e reaproveitar os benefícios que o Nerdify oferece de forma completa.

🧱 Todos eles possuem actions que são herdadas mas podem ser sobrescritas usando Ruby on Rails puro como explicado no contéudo sobre Ciclo de Vida.