Configurações de Página
O Nerdify permite configurar como as páginas são renderizadas através de opções no controller e nas actions do model. Essas configurações controlam o layout, autenticação e comportamento visual.
Configuração no Controller
Template
Define o template base usado para renderizar a página:
class Api::V1::CustomersController < Nerdify::ApplicationController
template "nerdify/templates/application"
end
Os templates disponíveis variam por projeto. No Onepet2, por exemplo:
| Template | Uso |
|---|---|
onepet_application | Páginas principais com menu lateral |
onepet_admin | Páginas administrativas |
onepet_session | Login e autenticação |
onepet_report | Relatórios e dashboards |
onepet_onboarding | Wizards de configuração |
Autenticação
Define qual modelo de usuário é usado para autenticação:
class Api::V1::CustomersController < Nerdify::ApplicationController
authenticate User, auth_path: "users/sign_in"
end
Opções:
User- Classe do modelo de usuárioauth_path- Caminho para redirecionamento em caso de não autenticado
Configuração nas Actions
As actions definem o comportamento de cada endpoint (index, show, new, edit, etc).
Layout
Define como a página é exibida:
action :show, layout: :default # Página completa
action :show, layout: :modal # Modal/dialog
action :show, layout: :embed # Incorporada em outra página
| Layout | Descrição |
|---|---|
:default | Página completa com navegação |
:modal | Abre como dialog/modal |
:embed | Sem header, para incorporar em outras páginas |
Modal Size
Define o tamanho do modal:
action :show, layout: :modal, modal_size: :lg
Valores: :sm, :md, :lg, :xl
Modal Styles
Estilos customizados para o modal:
action :edit, layout: :modal, modal_styles: {
width: "800px",
max_height: "90vh"
}
Without Page Header
Remove o header da página:
action :edit, without_page_header: true
Default List
Define qual lista usar por padrão na action index:
action :index, default_list: :kanban
Default Form Wizard
Define um wizard de formulário:
action :new, default_form_wizard: :step_by_step
Sobrescrevendo page_json
O método page_json pode ser sobrescrito no controller para adicionar dados extras:
class Api::V1::SalesController < Nerdify::ApplicationController
def page_json(action = nil)
json = super(action)
# Adicionar recursos extras
if %w[show edit].include?(params[:action])
json[:resources][:pdv_settings] = PdvSetting.first.as_json
json[:resources][:payment_methods] = PaymentMethod.active.map(&:as_json)
end
json
end
end
Estrutura do page_json
O método retorna um hash com:
{
request: { path: "/customers/123" },
resources: {
customer: { ... }, # Recurso principal
current_user: { ... }, # Usuário logado
filters: { ... }, # Filtros aplicados
params: { ... } # Parâmetros da requisição
},
components: [ ... ], # Componentes da UI
translations: { ... }, # Traduções
options: {
layout: "default",
pagination: { ... }
},
errors: [ ... ] # Erros de validação
}
Métodos de Scope
default_scope
Define o scope padrão para listagens:
def default_scope
:active # Usa Model.active por padrão
end
default_order
Define a ordenação padrão:
def default_order
:recent # Usa Model.recent por padrão
end
Ações Customizadas
Além das actions REST, você pode criar actions customizadas:
class Api::V1::SalesController < Nerdify::ApplicationController
def finalize
object.status = "pending"
object.save(validate: false)
render json: { redirect_to: "/sales" }
end
def approve
object.update(status: "approved")
render json: { success: true, toast: "Aprovado!" }
end
end
No model, defina a action correspondente:
action :finalize,
only: %w[edit],
on: :member,
click: { put: ":resource.id/finalize" }
Exemplo Completo
# Controller
class Api::V1::Platform::Modules::Pdv::SalesController < Nerdify::ApplicationController
authenticate User, auth_path: "users/sign_in"
template "nerdify/templates/onepet_application"
def default_scope
:sales
end
def default_order
:recent
end
def page_json(action = nil)
json = super(action)
if %w[show edit update].include?(params[:action])
json[:resources][:pdv_settings] = PdvSetting.accessible_by(current_ability).first.as_json
end
json
end
def finalize
object.status = "pending"
object.save(validate: false)
render json: { redirect_to: "/platform/modules/pdv/sales" }
end
end
# Model
class Sale
action :index, layout: :default
action :show, layout: :default, without_page_header: true
action :edit, layout: :default, without_page_header: true
action :finalize, only: %w[edit], on: :member, position: :footer,
click: { put: ":resource.id/finalize" }
end
Boas Práticas
Faça
- Use
layout: :modalpara formulários de criação/edição rápida - Use
layout: :embedpara sub-recursos (ex: pets de um cliente) - Sobrescreva
page_jsonpara adicionar dados contextuais - Defina
default_scopepara filtrar registros apropriadamente
Evite
- Lógica complexa dentro de
page_json - Múltiplos layouts para a mesma action sem condição clara
- Templates customizados desnecessários