Pular para o conteúdo principal

Fields

Os fields no Nerdify são a base para definir os campos do modelo, com regras de validação, exibição e tipos de dados. Eles integram o backend com o frontend, organizando a lógica de negócio e gerando automaticamente os componentes de entrada nas telas.

Cada campo é declarado com field :name, option1: :value, option2: :value, etc... e pode conter diversas opções complementares. O atributo name é obrigatório. Os demais atributos são opcionais.


⚙️ Opções padrão dos fields

Todos os campos aceitam as seguintes opções padrões:

OpçãoTipoDescrição
typeSymbolTipo de campo (ex: :date, :money, :string, etc)
viewSymbolExibição no frontend (:readonly, :editable, :viewonly)
layoutSymbolLayout do componente (:inside, :outside, :inline)
labelBooleanSe deve ou não incluir o label do campo no frontend
input_typeSymbolTipo de input renderizado no frontend (ex: :text, :date, etc)
defaultVariadoValor padrão para o campo
sizeIntegerNúmero de colunas de 1 a 12
attributeBooleanSe true, não será salvo no banco, apenas na instância
translateBooleanSe false, não será traduzido no frontend
i18nSymbolChave customizada para tradução
stylesHashEstilo visual customizado do campo
backend_ifStringCondição ruby executada no backend
render_ifStringCondição JS avaliada no frontend — oculta totalmente se false
show_ifStringCondição JS no frontend — oculta visualmente, mas mantém no DOM
detect_changesBooleanHabilita evento de detecção ao alterar o campo
submit_on_changeBooleanSubmete o formulário ao alterar qualquer campo
submit_on_inputBooleanSubmete ao digitar (em campos de texto)
validateBooleanCondição considerar ou não validações neste campo
validate_ifProcProc ruby para aplicar condição obrigatória para a validação ser necessária

🔍 Você também pode passar qualquer outra chave personalizada para uso em templates:

field :cpf, custom_flag: true, info: :demo

Esses valores (info, custom_flag) podem ser utilizados nos templates customizados para lógica condicional ou estilização dinâmica.


✅ Validações suportadas

As validações são baseadas nas validações padrão do Rails, e podem ser aplicadas diretamente como opções:

ValidaçãoExemplo
:presencefield :nome, presence: true
:lengthlength: { maximum: 100 }
:inclusioninclusion: %w[ativo inativo pendente]
:formatformat: /\A[A-Za-z]+\z/
:uniquenessuniqueness: true
:numericalitynumericality: { greater_than: 0 }
:acceptanceacceptance: true
:absenceabsence: true
:confirmationconfirmation: true
:validates_associatedvalidates_associated: true

Você também pode usar validate_if: com um Proc para criar uma condição obrigatória para a execução da validação.

field :password, presence: true, validate_if: -> { new_record? }

Neste exemplo, o campo password só será obrigatório se o modelo não existir no banco ainda (condição definida pelo método new_record?)


📌 Campos com opções específicas adicionais

Alguns tipos de campo suportam opções específicas extras. Por exemplo:

  • textarea aceita rows: 4
  • decimal aceita step: 0.1
  • text pode aceitar mask: "000.000.000-00"
  • select, checkbox e radio podem aceitar multiple: true, collection: "caminho", translate: true, etc.

Essas opções variam de tipo para tipo, e serão detalhadas na documentação específica sobre cada tipo de campo.

O foco aqui são as opções comuns a todos os fields.


🔎 Inferência automática de tipo

Se o tipo (type:) não for definido, o Nerdify tenta inferir com base no nome do campo:

Padrão de nomeTipo inferido
field :initial_datetype: :date
field :actived?type: :boolean
Nenhuma inferênciatype: :text

Essa lógica permite agilidade ao definir campos, reduzindo a necessidade de opções explícitas.


📋 Comportamento padrão por rota

As rotas do Nerdify influenciam o comportamento visual do campo. Se você não definir as opções view e layout diretamente, elas se comportarão por padrão conforme a tabela a seguir:

Rotaviewlayout
index:viewonly:inline
show:readonly:inside
new:editable:outside
edit:editable:outside

Esses valores podem ser sobrescritos com as opções view: e layout: diretamente no campo. Por exemplo:

field :name, type: :text, view: :editable, layout: :outside

📦 Tipos suportados de fields

Listar diretamente todos os tipos, com o tipo no backend e o hash padrão ao lado:

Tipo NerdifyTipo BackendHash padrão
textString{ default: nil, validate: true, input_type: :text }
textareaString{ default: nil, rows: 4, validate: true, input_type: :textarea }
numberInteger{ default: nil, validate: true, step: 1, input_type: :number }
decimalFloat{ default: nil, validate: true, step: 0.1, input_type: :decimal }
hiddenString{ default: nil, validate: true, input_type: :hidden }
codeString{ default: "", validate: true, input_type: :code }
cpfString{ format: /.../, mask: "000.000.000-00", validate: true, input_type: :text }
cnpjString{ format: /.../, mask: "00.000.000/0000-00", validate: true, input_type: :text }
cpf_or_cnpjString{ mask: "(00) 00000-0000", format: /.../, input_type: :text }
phoneString{ format: /.../, mask: "(00) 00000-0000", validate: true, input_type: :text }
moneyMoney{ mask: :money, validate: true, default: Money.new(0), input_type: :money }
credit_cardString{ format: /.../, mask: "0000000000000000", validate: true, input_type: :text }
cepString{ format: /.../, mask: "00000-000", validate: true, input_type: :text }
dateDate{ picker: :date, mask: "00/00/0000", validate: true, input_type: :date }
monthString{ validate: true, input_type: :month }
timeString{ validate: true, input_type: :time }
date_timeDateTime{ validate: true, input_type: :date_time }
weekString{ validate: true, input_type: :week }
avatarString{ uploader: ..., validate: true, input_type: :avatar }
dropzoneArray{ uploader: ..., upload: '../upload', validate: true, input_type: :dropzone }
fileString{ uploader: ..., validate: true, input_type: :file }
imageString{ uploader: ..., accept: "image/*", preview: :image, validate: true, input_type: :file }
emailString{ format: /.../, validate: true, input_type: :text }
urlString{ format: /.../, validate: true, input_type: :text }
htmlString{ validate: true, input_type: :html }
editorString{ validate: true, input_type: :editor }
colorString{ validate: true, input_type: :color }
passwordString{ validate: true, input_type: :password }
selectArray/String{ multiple: false, validate: true, translate: true, input_type: :select }
checkboxBoolean/Array{ multiple: false, validate: true, translate: true, input_type: :checkbox }
radioString{ multiple: false, validate: true, translate: true, input_type: :radio }
zip_codeString{ format: /.../, mask: "00000-000", input_type: :text }
credit_card_numberString{ format: /.../, mask: "0000000000000000000", input_type: :text }

🧩 Alguns campos possuem opções específicas adicionais — consulte a documentação individual de cada tipo para mais detalhes.

🧩 No frontend, eles são convertidos para componentes do tipo input e o tipo do input é definido pelo valor do atributo input_type, por isso ele é setado como padrão no hash default. Na prática um field :field_name, type: :date para o frontend é convertido em component :input, name: :field_name, input_type: :date. Enquanto no backend ele é convertido na chamada field :date, type: Date do MongoId, usando o tipo da coluna Tipo Backend da tabela acima.


🎨 Estilo visual com styles

O Nerdify aplica por padrão o estilo definido na constante Nerdify::Component::INPUT em cada campo. Você pode sobrescrever algum dos valores mantendo o restante usando o merge na constante:

field :name, styles: Nerdify::Component::INPUT.merge({background_color: :primary})

Ou substituir completamente definindo o hash diretamente:

field :name, styles: { background_color: :primary }

A estilização padrão de um field é a seguinte:

{
background: 'transparent',
border: {
left: 0,
right: 0,
top: 0,
bottom: 0
},
border_color: 'default',
rounded: {
top_left: 0,
top_right: 0,
bottom_left: 0,
bottom_right: 0
},
shadow: 0,
size: 5,
blur: 0,
padding: {
left: 0,
right: 0,
top: 0,
bottom: 0
},
margin: {
left: 0,
right: 0,
top: 0,
bottom: 0
},
negative_margin: {
left: 0,
right: 0,
top: 0,
bottom: 0
},
align: {
top: 'vertical',
left: 'vertical',
right: 'vertical',
bottom: 'vertical',
body: 'vertical'
}
}

🔍 Acessando definições no console

Você pode acessar os campos definidos com:

Customer.nerdify.inputs                    # Array de campos do modelo
input = Customer.nerdify.inputs.first # Retorna o primeiro campo do modelo
input.name # Retorna o nome do campo do modelo
input.options[:view] # Retorna a view configurada no modelo

Ou para acessar os filhos de um fieldset:

# Retorna o array de filhos do fieldset, podendo conter fields, components,embeds e fieldsets aninhados
Customer.nerdify.fieldsets.first.children

Isso permite inspecionar programaticamente os atributos e opções configuradas para personalizações ou verificações dinâmicas.


Com os fields, o Nerdify torna o processo de definição de modelos e regras de negócio estruturado, automatizado e diretamente conectado à interface final. 🧠✨