Прежде всего, вы должны поместить все методы хранения и сбора данных в Ресурсы и Модели, чтобы они были доступны со всех контроллеров. Вы можете сохранить внутренние операции по изменению данных в ваших отдельных контроллерах. Как только вы это организовали, вы можете сделать то, что делает Hobo: создать контроллер только для первой страницы, "front_controller", если хотите. Здесь вы можете отобразить данные, собранные со всех ваших моделей и ресурсов, а также ссылки на другие действия вашего контроллера.
Вот несколько интересных мыслей о лучшей организации ваших моделей и контроллеров (толстые модели, тощие контроллеры - это практическое правило).
Поскольку вы сказали, что используете другие API (например, lastfm и twitter), вам может понадобиться взглянуть на это 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 способов запуска фоновых заданий в 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