2009-05-19 17 views
7

Estoy trabajando en algo así como una malla de redes sociales; Estoy usando diferentes API de varios sitios web, p. Last.FM, Delicious, Twitter, ...Uso de varios controladores en una vista en Rails

He creado un controlador por cada sitio web (actualmente, hay 7).

vistas de la muestra:

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 
... 

Ahora quieren mostrar estos datos en otros una vista (localhost: 3000/index.hmtl) mediante el uso de estos diferentes controladores.

componentes están en desuso, la creación de un controlador y entierran todos los API en que parece feo, también ..

Así que no saben cómo hacer esto. ¿Alguna idea?

Respuesta

8

En primer lugar, debe poner todos los métodos de almacenamiento y recopilación de datos en Recursos y Modelos para que sean accesibles desde todos los controladores. Sin embargo, puede mantener las operaciones internas de mutación de datos en sus controladores individuales. Una vez que lo haya organizado así, podría hacer lo que hace Hobo: crear un controlador solo para la página frontal, "front_controller" si lo desea. Aquí puede visualizar datos recopilados de todos sus modelos y recursos, así como enlaces a sus otras acciones de controlador.

Estos son algunos interestingthoughts en una mejor organización de sus modelos y controladores (modelos de grasa, los controladores flaco es una regla de oro. ya que dijo que está utilizando de (como lastfm y Twitter) otra API, es posible que desee tomar un vistazo a this railscasts sobre la creación de modelos que no son ActiveRecord (modelos que no están vinculados a una base de datos)

aquí hay un pseudo código, tenga en cuenta que realmente solo está dirigido a su pregunta.

# 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 

que podría ser mucho mejor tengan una trayectoria de trabajo actualizar sus servicios en lugar de descanso-un controlador que es necesario invocar cada vez que se desea obtener los últimos tweets. aquí es buen artículo que muestra - 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 mi texto exacto: P –

+1

(Aunque esta respuesta copia el texto de las otras dos respuestas, estoy comentando aquí ya que esta es la respuesta aceptada.) En lugar de crear un modelo que no sea ActiveRecord, puede en la actualidad utilice [ActiveModel] (https://github.com/rails/rails/tree/master/activemodel), que "proporciona un conjunto conocido de interfaces para el uso en clases de modelos. Permiten que los ayudantes de Action Pack interactúen con los no activos Modelos de registro, por ejemplo ". –

6

En primer lugar, debe poner todos los métodos de almacenamiento y recopilación de datos en Recursos y Modelos para que sean accesibles desde todos los controladores. Sin embargo, puede mantener las operaciones internas de mutación de datos en sus controladores individuales. Una vez que lo haya organizado así, podría hacer lo que hace Hobo: crear un controlador solo para la página frontal, "front_controller" si lo desea. Aquí puede visualizar datos recopilados de todos sus modelos y recursos, así como enlaces a sus otras acciones de controlador.

+1

Este. Ponga su colección de datos en modelos. Buscando en Twitter? Eso es un odel. Scraping Last.fm? Ese es un modelo. Los controladores son para que los clientes hablen con * usted *: procesan las solicitudes. –

4

Creo que deberías leer un poco sobre los rieles 'MVC architecture. Me parece que está descuidando la parte M (odel). Los modelos deben contener los datos, siendo la parte más importante de su aplicación.
Estas son algunas interestingthoughts en una mejor organización de sus modelos y controladores (modelos de grasa, los controladores flaco es una regla de oro.
ya que dijo que está utilizando otra API de (como lastfm y Twitter), es posible que desee tomar una mira this railscast sobre la creación de modelos que no son ActiveRecord (modelos que no están vinculados a una base de datos)

Si también proporcionas una API para tus usuarios, sugiero usar un enfoque RESTful, ya que puede ser realmente fácil de desarrollar y mantener una vez ponle el truco.
Debes leer más sobre resources, ya que tu localhost/lastfm y localhost/twitter son recursos y no visitas.

Espero que esto ayude. Buena suerte

Cuestiones relacionadas