Pular para o conteúdo principal

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:

TemplateUso
onepet_applicationPáginas principais com menu lateral
onepet_adminPáginas administrativas
onepet_sessionLogin e autenticação
onepet_reportRelatórios e dashboards
onepet_onboardingWizards 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ário
  • auth_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
LayoutDescrição
:defaultPágina completa com navegação
:modalAbre como dialog/modal
:embedSem header, para incorporar em outras páginas

Define o tamanho do modal:

action :show, layout: :modal, modal_size: :lg

Valores: :sm, :md, :lg, :xl

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: :modal para formulários de criação/edição rápida
  • Use layout: :embed para sub-recursos (ex: pets de um cliente)
  • Sobrescreva page_json para adicionar dados contextuais
  • Defina default_scope para 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