ActiveModel::Naming: o que model_name devolve
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_namedevolve um objetoActiveModel::Namecom nove valores de nome (name,singular,plural,element,collection,route_key,singular_route_key,param_key,i18n_key) maishuman. Ele é calculado uma vez e guardado.elementecollectionguiam a busca de partials (to_partial_pathécollection/element), eparam_keyé o prefixo de todo nome de campo queform_withgera, o mecanismo por trás dos exemplos de "Form objects: lógica complexa".route_keyesingular_route_keysão as formas plural e singular que um helper de rota usaria se este objeto tivesse rotas.i18n_keyehuman, presentes em todoActiveModel::Name, são o assunto da aula 4: como traduções e o texto de reserva são derivados.
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.