Como funciona uma visualização (MVC)?
-
22-09-2019 - |
Pergunta
Estou trabalhando em um aplicativo da web sem estrutura no momento e tentando estruturá-lo como um aplicativo MVC.O problema é que existem alguns aspectos técnicos dos aplicativos MVC que me escapam.
Principalmente, como uma visão deve ser construída?Gostaria de usar uma linguagem de marcação como eRuby ou #haml, mas não sei exatamente como elas funcionam e como implementá-las em um aplicativo não Rails.
Como a visualização obtém dados do modelo e instruções do controlador?No Rails, tudo isso é ofuscado.Como posso implementar isso?Qual é a teoria por trás disso?Faço uma conexão com meu banco de dados na view e depois uso ele livremente lá?Devo passar por outro programa além do renderizador #haml para fornecer dados?
Obrigado!
Solução
Ainda não tenho pontos suficientes para comentar, mas para responder sua pergunta sobre a resposta do cwninja, na maioria dos casos você renderiza o formulário de visualização dentro de uma ação do controlador.Um controlador recebe uma solicitação, executa a ação correta e retorna uma resposta, neste caso uma visualização renderizada como corpo da resposta.Um exemplo simples usando haml poderia ser assim:
class SomeController
def some_action
@foo = "bar"
Haml::Engine.new(template).render(self)
end
end
Neste caso, as variáveis de instância configuradas no controlador serão automaticamente disponibilizadas para a visualização, pois são definidas no mesmo contexto.As variáveis do modelo não estarão disponíveis como deveriam, porém qualquer coisa que você possa acessar a partir da ação do controlador pode ser acessada a partir da visualização.A maioria dos sistemas de templates também permite passar um hash de variáveis locais para a visualização, por exemplo:
Haml::Engine.new(template).render(self, {:foo => "bar"})
Espero que isso esclareça um pouco da sua confusão :)
Outras dicas
Caso simples:
ERB.new("your_template.erb").result(binding)
Isto avaliará o modelo com o contexto de onde ele é chamado.
Minha maneira preferida/simplista de fazer isso é apenas chamá-lo dentro do controlador e lidar com o controlador e a visualização sendo um pouco mescladas.
Se você não quiser fazer isso, você precisa criar uma classe de visualização, que tenha um método como segue:
def get_binding
binding
end
Em seguida, crie uma nova instância, definindo todas as variáveis de instância conforme necessário na visualização e chame:
view = ViewClass.new
view.object = my_data_from_the_db
return [200, {…}, [ERB.new("your_template.erb").result(view.get_binding)] ]
Ou… simplesmente desista e use o sinatra.