ActiveModel::Naming: o que model_name devolve

Prévia grátis 3 min de leitura

Além de ActiveModel::Model e attributes

"Form objects: lógica complexa" tratou de ActiveModel::Model, de ActiveModel::Attributes e de como form_with chama model_name, persisted? e to_key num objeto Ruby simples para montar um formulário que funciona. Aquele curso tratou model_name como um método que devolve uma coisa de que o Rails precisa. Este curso continua dali. model_name não devolve uma string. Ele devolve um objeto, ActiveModel::Name, que carrega nove valores de nome mais um nome legível, e cada um tem uma função.

O objeto, campo a campo

Uma classe Ruby simples com ActiveModel::Model e mais nada:

class ScratchBookCover
  include ActiveModel::Model
end

n = ScratchBookCover.model_name
n.name                # => "ScratchBookCover"
n.singular             # => "scratch_book_cover"
n.plural                # => "scratch_book_covers"
n.element                 # => "scratch_book_cover"
n.collection                # => "scratch_book_covers"
n.route_key                    # => "scratch_book_covers"
n.singular_route_key             # => "scratch_book_cover"
n.param_key                        # => "scratch_book_cover"
n.i18n_key                           # => :scratch_book_cover
n.human                                # => "Scratch book cover"

São todos os campos, de uma chamada só, e não um recorte escolhido para o exemplo. O código instalado do Rails (active_model/naming.rb) calcula todos uma vez, em ActiveModel::Name#initialize, e model_name guarda o objeto, então chamadas repetidas devolvem o mesmo.

Onde cada um é usado

singular e plural são as formas base com sublinhado sobre as quais os outros valores se constroem. element e collection guiam a busca de partials por convenção: to_partial_path devolve "#{collection}/#{element}", aqui scratch_book_covers/scratch_book_cover. param_key é o prefixo dos campos do formulário: form_with(model: cover) gera scratch_book_cover[title], e não só title, por causa desse valor. route_key e singular_route_key são os nomes que os helpers de rota teriam se este objeto tivesse rotas: scratch_book_covers_path (plural, para index e create) e scratch_book_cover_path (singular, para show e update). i18n_key e human ficam para a aula 4: o escopo de busca no I18n e o texto legível de reserva.

O que "Form objects: lógica complexa" usou sem dizer o nome

Aquele curso mostrou form_with(model: @form, url: ...) gerando HTML correto sem dizer qual desses valores fazia o trabalho. Era o param_key o tempo todo. Nomes de campo como scratch_book_cover[title] vêm dele, e não do Rails inspecionando o nome da classe de novo a cada requisição.

Pontos-chave

  • model_name devolve um objeto ActiveModel::Name com nove valores de nome (name, singular, plural, element, collection, route_key, singular_route_key, param_key, i18n_key) mais human. Ele é calculado uma vez e guardado.
  • element e collection guiam a busca de partials (to_partial_path é collection/element), e param_key é o prefixo de todo nome de campo que form_with gera, o mecanismo por trás dos exemplos de "Form objects: lógica complexa".
  • route_key e singular_route_key são as formas plural e singular que um helper de rota usaria se este objeto tivesse rotas.
  • i18n_key e human, presentes em todo ActiveModel::Name, são o assunto da aula 4: como traduções e o texto de reserva são derivados.
Aula 1 de 7 · grátis

Continue com a aula 2

route_key, param_key e i18n_key: o namespace muda cada um de um jeito

Numa classe com namespace, element descarta o módulo, param_key e route_key o achatam com sublinhados, e i18n_key usa barra.

Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.

Digite para buscar...