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
objecteobjects - 🔍 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étodo | Descrição | Retorno esperado |
|---|---|---|
object | Retorna a instância do modelo. | Instância do modelo |
objects | Retorna a lista de objetos filtrada, paginada e ordenada. | Mongoid::Criteria ou array de objetos |
criteria | Define os filtros a serem aplicados com base nos params. | Hash de filtros |
default_scope | Define o escopo padrão da listagem (por ex: :ativos, :all). | Symbol |
page_json | Define os componentes a serem renderizados na resposta. | Hash JSON com estrutura da tela |
object_parameters | Define 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
criterianormalmente com base nos filtros - 🚫 Não permite edição, criação ou exclusão de dados
- 🧱 Utiliza
page_jsonpara 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étodo | Descrição | Retorno esperado |
|---|---|---|
criteria | Define os filtros a serem aplicados com base nos params. | Hash de filtros |
default_scope | Define o escopo padrão dos relatórios. | Symbol |
page_json | Define 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étodo | Descrição | Retorno esperado |
|---|---|---|
current_user | Retorna o usuário autenticado da sessão. | Instância de User |
build_auth_header | Monta o cabeçalho de autenticação para o frontend. | Hash com token e metadata |
auth_response | Define o payload retornado após login. | Hash com dados do usuário e permissões |
page_json | Define 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.