Использование нескольких контроллеров в одном представлении в Rails - PullRequest
7 голосов
/ 20 мая 2009

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

Я создал один контроллер для каждого веб-сайта (в настоящее время их 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
...

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

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

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

Ответы [ 3 ]

8 голосов
/ 20 мая 2009

Прежде всего, вы должны поместить все методы хранения и сбора данных в Ресурсы и Модели, чтобы они были доступны со всех контроллеров. Вы можете сохранить внутренние операции по изменению данных в ваших отдельных контроллерах. Как только вы это организовали, вы можете сделать то, что делает 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
6 голосов
/ 20 мая 2009

Прежде всего, вы должны поместить все методы хранения и сбора данных в Ресурсы и Модели, чтобы они были доступны со всех контроллеров. Вы можете сохранить внутренние операции по изменению данных в ваших отдельных контроллерах. Как только вы это организовали, вы можете сделать то, что делает Hobo: создать контроллер только для первой страницы, "front_controller", если хотите. Здесь вы можете отобразить данные, собранные со всех ваших моделей и ресурсов, а также ссылки на другие действия вашего контроллера.

4 голосов
/ 20 мая 2009

Я думаю, вы должны прочитать немного о архитектуре рельсов MVC . Мне кажется, что вы пренебрегаете М (одель) частью этого. Модели должны содержать данные, таким образом, являясь наиболее важной частью вашего приложения.
Вот несколько интересных мыслей о лучшей организации ваших моделей и контроллеров ( толстые модели, тощие контроллеры - это практическое правило.
Поскольку вы сказали, что используете другие API (например, lastfm и twitter), вы можете взглянуть на this railscast о создание не ActiveRecord моделей (моделей, которые не привязаны к базе данных)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...