Qual técnica Ruby o Rails usa para fazer com que meus métodos de controlador renderizem visualizações?
Apenas estou curioso para saber se alguém usa a técnica Ruby para realizar o seguinte na estrutura do Rails.
Se eu não escrever, digamos, umindex
Em um controlador Rails, o Rails ainda renderiza o arquivo de exibição de índice se o URL corresponder a essa rota. Isso faz sentido, porque meu controlador herda de uma classe pai, que deve ter sua própriaindex
método.
No entanto, se euFaz definir umindex
e apenas diz para definir uma variável de instância, ele ainda renderiza a exibição apropriada. Por exemplo:
def index
@weasels = Weasel.all
# If I omit this line, Rails renders the index anyway.
# If this behavior is defined in the parent class's index method,
# it seems that by overriding the method, my index wouldn't do it.
# I'm not explicitly calling super to get the method from
# ActionController::Base, but maybe Rails is doing something like that?
render :index
end
Em puro Ruby, eu esperaria ter que ligarsuper
para conseguir esse comportamento.
Eu assumo que o Rails usa algum tipo de técnica de metaprogramação para garantir que meus métodos de controlador chamarãosuper
. Se sim, alguém pode explicar isso? Você pode apontar para o código fonte que faz isso?
Como Mladen Jablanović apontou, meu modelo mental inicial estava errado; o método do controlador normalmente não renderiza a visualização; em vez de,ambos o método do controladore a renderização da vista é chamada por algum código de estrutura. Isso é aparente porque eu posso criar um método de controlador com qualquer nome - por exemplo,search
- e assearch
a visualização será renderizada. Então, claramente, não estou substituindo um método pai nesse caso, e algum código de estrutura está analisando o nome do método do controlador e procurando a visualização correspondente.
Ainda assim, a estrutura deve ser capaz de detectar se o método do controlador já chamou ou nãorender
. Então isso é outro pequeno mistério para mim.