2009-05-19 7 views
7

Sto lavorando su qualcosa come una rete di social network; Sto utilizzando diverse API da vari siti web, ad es. Last.FM, Delicious, Twitter, ...Utilizzo di più controller in una vista in Rails

Ho creato un controller per ogni sito Web (attualmente ce ne sono 7).

vista di esempio:

localhost:3000/lastfm <- All datas i gathered from user's Last.fm account 
localhost:3000/twitter <- All datas i gathered from user's Twitter account 
... 

Ora voglio mostrare questi dati in un'unica vista (localhost: 3000/index.hmtl) utilizzando questi controller differenti.

componenti sono deprecati, la creazione di un controller e seppellire tutte le API in che sembra brutto, troppo ..

Quindi non so come fare questo. Qualche idea?

risposta

8

Prima di tutto, dovresti mettere tutti i metodi di archiviazione dati e raccolta dati in Risorse e Modelli in modo che siano accessibili da tutti i controller. È tuttavia possibile mantenere le operazioni di modifica dei dati interne nei singoli controller. Una volta organizzato in questo modo, puoi fare quello che fa Hobo: creare un controller solo per la prima pagina, "front_controller", se lo desideri. Qui puoi visualizzare i dati raccolti da tutti i tuoi modelli e risorse, nonché i link alle altre azioni del tuo controller.

Questi sono alcuni interestingthoughts sui organizzare meglio i vostri modelli e controllori (modelli di grasso, i controllori magro è una regola empirica. Dal momento che lei ha detto che si sta utilizzando di (come LastFM e Twitter) altre API, si potrebbe desiderare di prendere uno sguardo su this railscasts sulla creazione di modelli non ActiveRecord (modelli che non sono collegati a un database)

ecco alcuni pseudo-codici, tenere presente che in realtà è solo mirato alla tua domanda.

# pseudo code 

    class TwitterController < ApplicationController 
    def index 
     @services = { 
     :twitter => TwitterModel.find(:all, ...), 
     } 
    end 
    def update_twitter 
     TwitterUpdaterClass.update { |twit| 
     _m = TwitterModel.new 
     _m.message = twit.msg 
     _m.from = twit.from 
     # .. 
     _m.save 
     } 
    end 
    end 


    class MyIndexController < ApplicationController 
    def index 
     @services = { 
     :twitter => TwitterModel.find(:all, ...), 
     :lastfm => LastFmModel.find(:all, ...) 
     } 
    end 
    end 

è potrebbe essere molto meglio di avere sfondo di lavoro aggiornare il vostro riposo-servizi, invece di un controller che è necessario richiamare ogni volta che si desidera prendere tweets recenti. qui è bello articolo mostra - 6 ways to run background jobs in rubyonrails

# more pseudo code 

    class TwitterWorker < BackgrounDRb::MetaWorker 
    set_worker_name :twitter_worker 
    def create(args = nil) # instead of TwitterController.update_twitter 
     TwitterUpdaterClass.update { |twit| 
     _m = TwitterModel.new 
     _m.message = twit.msg 
     _m.from = twit.from 
     # .. 
     _m.save 
     } 
    end 
    end 
+1

GJ ganking il mio testo esatto: P –

+1

(Anche se questa risposta copia il testo delle altre due risposte, sto commentando qui poiché questa è la risposta accettata.) Invece di creare un modello non ActiveRecord, puoi oggigiorno utilizzare [ActiveModel] (https://github.com/rails/rails/tree/master/activemodel), che "fornisce un set noto di interfacce per l'utilizzo nelle classi del modello e consente agli helper di Action Pack di interagire con non-Active Registra modelli, per esempio. " –

6

Prima di tutto, dovresti mettere tutti i metodi di archiviazione dei dati e raccolta dati in Risorse e Modelli in modo che siano accessibili da tutti i controller. È tuttavia possibile mantenere le operazioni di modifica dei dati interne nei singoli controller. Una volta organizzato in questo modo, puoi fare quello che fa Hobo: creare un controller solo per la prima pagina, "front_controller", se lo desideri. Qui puoi visualizzare i dati raccolti da tutti i tuoi modelli e risorse, nonché i link alle altre azioni del tuo controller.

+1

questo. Metti la tua collezione di dati in modelli. Stai cercando su Twitter? È un odore. Scraping Last.fm? Questa è una modella. I controller consentono ai clienti di parlare con * voi * - elaborano le richieste. –

4

Penso che dovresti leggere un po 'sui binari' MVC architecture. Mi sembra che stai trascurando la parte M (odel) di esso. I modelli devono contenere i dati, quindi rappresentano la parte più importante della tua applicazione.
Questi sono alcuni interestingthoughts su una migliore organizzazione dei vostri modelli e controllori (modelli di grasso, i controllori magro è una regola empirica.
Dal momento che lei ha detto che si sta utilizzando altre API (come LastFM e Twitter), si potrebbe desiderare di prendere una guarda this railscast sulla creazione di modelli non ActiveRecord (modelli non legati a un database)

Se fornisci anche un'API per i tuoi utenti, ti suggerisco di utilizzare un approccio RESTful, in quanto può essere davvero facile da sviluppare e mantenere una volta
Dovresti leggere di più su resources, come il tuo localhost/lastfm e localhost/twitter sono risorse e non visualizzazioni.

Spero che questo aiuti. Buona fortuna

Problemi correlati