Composição
Você monta um componente aninhando helpers, como o shadcn/ui aninha componentes React. A view fica com a mesma forma do HTML que ela gera.
Helpers só existem para o que está instalado
Cada componente instala o próprio módulo de helper:
button grava app/helpers/ui/button_helper.rb,
que define Ui::ButtonHelper#ui_button. O Rails inclui
automaticamente tudo que está em app/helpers/, então um helper
instalado está disponível em todas as views, sem include.
O helper de um componente que não está instalado não existe, e chamá-lo levanta
NoMethodError quando a página renderiza. Confira
installed[].helpers antes de escrever a view.
Sobrou um ui_helper.rb na raiz?
app/helpers/ui_helper.rb, que define
helpers de componentes que você talvez não tenha. O status --json aponta
esse arquivo em helpers.legacyHelperPresent, e você pode apagá-lo.
Subcomponentes são helpers aninhados
Estes componentes não usam slots do ViewComponent nem recebem o conteúdo como argumento. Você os monta aninhando chamadas.
bin/shadwire info <nome> lista o helper de cada parte. Consulte em vez
de chutar: o helper é ui_card_content, e não
ui_card_body.
Use a composição inteira
Não coloque tudo numa parte só. Header, title e description renderizam cada um a sua própria marcação, e jogar tudo dentro do content perde isso.
Itens ficam dentro do grupo
O mesmo vale para ui_tabs_trigger dentro de
ui_tabs_list, ui_breadcrumb_item dentro de
ui_breadcrumb_list e ui_pagination_item dentro de
ui_pagination_content.
Overlays sempre precisam de título
dialog, alert-dialog,
sheet e drawer precisam do componente de título
para que leitores de tela consigam anunciá-los, mesmo quando o layout não mostra um
título visível.
Componentes interativos precisam de Stimulus
29 dos 57 componentes trazem um controller.
O bin/shadwire info <nome> indica quais pelo campo
requiresStimulus, e status.stack diz se o app tem
importmap e stimulus-rails.
Os controllers são instalados em app/javascript/controllers/ e se
registram pelo eagerLoadControllersFrom("controllers", application)
do controllers/index.js. Se o seu app registra controllers
explicitamente, registre os novos lá também.
Renderizando a classe diretamente
O helper só embrulha a classe, então as duas formas renderizam a mesma coisa:
Nas views, use o helper. Use a classe quando precisar do próprio objeto do componente,
ou dentro de outro ViewComponent. ViewComponents não recebem helpers automaticamente,
então inclua o módulo para chamar ui_button no template do
componente: