2009-05-19 3 views
7

Я работаю над чем-то вроде социальной сетки; Я использую разные API от различных веб-сайтов, например. Last.FM, Delicious, Twitter, ...Использование нескольких контроллеров в одном представлении в Rails

Я создал один контроллер на каждый веб-сайт (в настоящее время их 7).

Примеры просмотров:

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

Теперь я хочу, чтобы показать эти ДАННЫЕ в одном окне (локальный: 3000/index.hmtl), используя эти различные контроллеры.

компоненты устарели, создавая один контроллер и похоронить все API, что кажется уродливым, тоже ..

Так что я не знаю, как это сделать. Есть идеи?

ответ

8

Прежде всего, вы должны поместить все методы хранения данных и сбора данных в ресурсы и модели, чтобы они были доступны из всех контроллеров. Тем не менее, вы можете сохранить внутренние операции с изменением данных в своих индивидуальных контроллерах. Как только вы его организовали так, вы можете сделать то, что делает Hobo: создайте контроллер только для первой страницы, «front_controller», если хотите. Здесь вы можете отображать данные, собранные из всех ваших моделей и ресурсов, а также ссылки на другие действия вашего контроллера.

Вот несколько interestingthoughts на лучшей организации ваших моделей и контроллеров (жир моделей, тощий контроллеров является правилом. Так как вы сказали, что вы используете другой API, (например, LastFM и щебет), вы можете взять посмотрите на this railscasts о создании моделей не ActiveRecord (модели, которые не привязаны к базе данных)

вот какой-то псевдокод, имейте в виду, что он действительно нацелен только на ваш вопрос.

# 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 

это может быть гораздо лучше иметь фоновые рабочие обновить ваш отдых-услуг, а контроллер, который нужно вызвать каждый раз, когда вы хотите получать последние твиты. здесь хорошая статья, показывающая - 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 мой точный текст: P –

+1

(Несмотря на то, что этот ответ копирует текст двух других ответов, я комментирую здесь, так как это принятый ответ.) Вместо того, чтобы создавать не-ActiveRecord модель, вы можете в настоящее время используйте [ActiveModel] (https://github.com/rails/rails/tree/master/activemodel), который «предоставляет известный набор интерфейсов для использования в классах моделей. Они позволяют помощникам Action Pack взаимодействовать с неактивными Например, модели записей. " –

6

Прежде всего, вы должны поместить все методы хранения и сбора данных в ресурсы и модели, чтобы они были доступны из всех контроллеров. Тем не менее, вы можете сохранить внутренние операции с изменением данных в своих индивидуальных контроллерах. Как только вы его организовали так, вы можете сделать то, что делает Hobo: создайте контроллер только для первой страницы, «front_controller», если хотите. Здесь вы можете отображать данные, собранные из всех ваших моделей и ресурсов, а также ссылки на другие действия вашего контроллера.

+1

Это. Включите вашу сборку данных в моделями. Поиск в Twitter? Это странно. Скремблирование Last.fm? Это модель. Контроллеры предназначены для того, чтобы клиенты разговаривали с * вами * - они обрабатывают запросы. –

4

Я думаю, вы должны немного прочитать о рельсах MVC architecture. Мне кажется, что вы пренебрегаете частью M (odel). Модели должны содержать данные, являясь наиболее важной частью вашего приложения.
Это несколько interestingthoughts на более упорядочивать модели и контроллеры (жира моделей, исхудавшие контроллеры это правило.
Так как вы сказали, что вы используете другой API, (например, LastFM и щебет), вы можете взять посмотрите на this railscast о создании моделей не ActiveRecord (модели, которые не привязаны к базе данных)

Если вы также предоставляете API для своих пользователей, я предлагаю использовать подход RESTful, так как его действительно можно легко разработать и обслуживать, как только вы получите
. Вы должны узнать больше о resources, так как ваши localhost/lastfm и localhost/twitter являются ресурсами и не просмотров.

Надеюсь, это поможет. Удачи

Смежные вопросы