2010-01-25 14 views
1

Je travaille actuellement sur une application web sans framework, et j'essaye de la structurer en application MVC. Le problème est, il y a certains aspects techniques des applications MVC qui m'échappent.Comment fonctionne une vue (MVC)?

Principalement, comment devrait être construite une vue? Je voudrais utiliser un langage de balisage comme eRuby ou #haml, mais je ne sais pas exactement comment ils fonctionnent et comment les implémenter dans une application non-Rails.

Comment la vue obtient-elle des données du modèle et des instructions du contrôleur? Dans Rails, tout cela est obscurci. Comment puis-je l'implémenter? Quelle est la théorie derrière cela? Est-ce que je fais une connexion à ma base de données dans la vue et l'utilise ensuite librement? Est-ce que je l'ai fait passer par un autre programme en dehors du moteur de rendu #haml pour lui donner des données?

Merci!

Répondre

2

Je n'ai pas encore assez de points pour commenter mais pour répondre à votre question sur la réponse de cwninja, dans la plupart des cas vous rendez le formulaire de vue dans une action du contrôleur. Un contrôleur reçoit une requête, exécute l'action correcte et renvoie une réponse, dans ce cas une vue rendue en tant que corps de réponse. Un exemple simple en utilisant haml pourrait ressembler à ceci:

class SomeController 

def some_action 
    @foo = "bar" 
    Haml::Engine.new(template).render(self) 
end 
end 

Dans ce cas, les variables d'instance configuration du contrôleur sera automatiquement disponible à la vue car ils sont définis dans le même contexte. Les variables du modèle ne seront pas disponibles comme elles ne le devraient pas, cependant tout ce que vous pouvez accéder à partir de l'action du contrôleur est accessible à partir de la vue. La plupart des systèmes de matriçage vous permettent également de passer le long d'un hachage de variables locales à la vue, par exemple:

Haml::Engine.new(template).render(self, {:foo => "bar"}) 

J'espère que cela efface une partie de votre confusion :)

+0

C'est le cas - merci! Cela répond complètement à ma question - bravo! – Isaac

+0

Super, je suis content de pouvoir aider – pmh

1

cas simple:

ERB.new("your_template.erb").result(binding) 

Cela permettra d'évaluer le modèle avec le contexte où il est appelé.

Mon moyen préféré/simpliste de faire cela est de simplement l'appeler à l'intérieur du contrôleur, et de traiter le contrôleur et la vue d'être un peu fusionné.

Si vous ne voulez pas faire cela, vous devez créer une classe de vue, qui a une méthode comme suit:

def get_binding 
    binding 
end 

Ensuite, créez une nouvelle instance, le réglage de tous les variables d'instance, au besoin en la vue, puis appelez:

view = ViewClass.new 
view.object = my_data_from_the_db 
return [200, {…}, [ERB.new("your_template.erb").result(view.get_binding)] ] 

Ou ... il suffit d'abandonner et d'utiliser sinatra.

+0

Cela efface un peu les choses - un chose: comment restez-vous strictement MVC et pourtant nourrir les choses à la vue? Où traitez-vous la vue (en HTML) et comment la vue obtient-elle les variables du modèle dont elle a besoin? – Isaac

+0

Rails copie toutes les variables d'instance du contrôleur vers la vue (avec un peu de 'magie' pour déléguer les méthodes helper_methods). Il n'y a pas de bonne raison que le contrôleur ne puisse pas simplement créer un objet de vue et le rendre lui-même. – cwninja