Domanda

Sto lavorando su un web-app senza un quadro in questo momento, e sto cercando di strutturarlo come un app MVC. Il problema è che ci sono alcuni aspetti tecnici di applicazioni MVC che mi sfuggono.

In primo luogo, come dovrebbe essere una vista costruire? Mi piacerebbe usare un linguaggio di markup come eRuby o #haml, ma non so esattamente come funzionano e come implementarli in un'applicazione non-Rails.

In che modo la vista ottenere i dati dal modello e le indicazioni dal controller? In Rails, questo è tutto offuscato. Come posso realizzare questo? Qual è la teoria dietro questo? Faccio un collegamento al mio database nella vista e quindi utilizzarlo liberamente lì? Ce l'ho passare attraverso un altro programma a parte solo il renderer #haml per dare i dati?

Grazie!

È stato utile?

Soluzione

Non ho ancora abbastanza punti di commentare, ma per rispondere alla tua domanda sulla risposta di cwninja, nella maggior parte dei casi si esegue il rendering del modulo di vista all'interno di un'azione del controller. Un controller riceve una richiesta, esegue l'azione destra e ritorno una risposta, in questo caso una vista reso come il corpo della risposta. Un semplice esempio utilizzando Haml potrebbe assomigliare a questo:

class SomeController

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

In questo caso la configurazione variabili istanza nel controllore verrà automaticamente reso disponibile alla vista poiché sono definiti nello stesso contesto. Le variabili del modello non saranno disponibili come dovrebbero, tuttavia nulla è possibile accedere dalla azione di controllo si può accedere dalla vista. La maggior parte dei sistemi di templating permettono anche di passare lungo un hash delle variabili locali alla vista, ad esempio:

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

Spero che questo chiarisce alcune delle vostra confusione:)

Altri suggerimenti

Caso semplice:

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

Questa valuterà il modello con il contesto del luogo in cui si chiama.

Il mio modo preferito / semplicistica di fare questo è quello di chiamare solo all'interno del controller, e trattare con il controller e vista essendo un po 'unito.

Se non si vuole fare questo, è necessario creare una classe di visualizzazione, che dispone di un metodo come segue:

def get_binding
  binding
end

Quindi creare una nuova istanza, impostare tutte le variabili di istanza come necessario nella vista, quindi chiamare:

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

Oppure ... solo rinunciare una e Sinatra uso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top