【问题标题】:Using multiple controllers in one view in Rails在 Rails 的一个视图中使用多个控制器
【发布时间】:2009-05-19 23:10:08
【问题描述】:

我正在开发类似社交网络的东西;我正在使用来自不同网站的不同 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 都埋在其中,看起来也很丑陋。

所以我不知道该怎么做。有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    首先,您应该将所有数据存储和数据收集方法放入资源和模型中,以便所有控制器都可以访问它们。不过,您可以将内部数据变异操作保留在您的各个控制器中。一旦你把它组织成这样,你就可以做 Hobo 所做的:为首页创建一个控制器,如果你愿意的话,“front_controller”。在这里,您可以显示从所有模型和资源收集的数据,以及指向其他控制器操作的链接。

    这些是一些 interesting thoughts 更好地组织你的模型和控制器(胖模型,瘦控制器是一个经验法则。 既然您说您正在使用其他 API(如 lastfm 和 twitter),您可能想看看 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
    

    【讨论】:

    • (尽管这个答案复制了其他两个答案的文本,但我在这里发表评论,因为这是公认的答案。)现在您可以使用@987654325 而不是创建非ActiveRecord 模型@,它“提供了一组已知的用于模型类的接口。例如,它们允许 Action Pack 助手与非 Active Record 模型进行交互。”
    【解决方案2】:

    首先,您应该将所有数据存储和数据收集方法放入资源和模型中,以便所有控制器都可以访问它们。不过,您可以将内部数据变异操作保留在您的各个控制器中。一旦你把它组织成这样,你就可以做 Hobo 所做的:为首页创建一个控制器,如果你愿意的话,“front_controller”。在这里,您可以显示从所有模型和资源收集的数据,以及指向其他控制器操作的链接。

    【讨论】:

    • 这个。将您的数据收集放入模型中。搜索推特?那是一个奥德。抓取 Last.fm?那是一个模型。控制器是供客户与交谈的——他们处理请求。
    【解决方案3】:

    我认为您应该阅读一下有关 rails 的 MVC architecture 的信息。 在我看来,您忽略了其中的 M(odel) 部分。模型应该保存数据,因此是应用程序中最重要的部分。
    这些是关于更好地组织模型和控制器(胖模型、瘦控制器的一些interesting thoughts是经验法则。
    既然你说你正在使用其他 API(如 lastfm 和 twitter),你可能想看看 this railscast 关于创建非 ActiveRecord 模型(不绑定到数据库的模型)

    如果您还为您的用户提供 API,我建议您使用 RESTful 方法,因为一旦掌握了它,它就真的很容易开发和维护。
    您应该阅读有关resources 的更多信息,因为您的localhost/lastfmlocalhost/twitter 是资源,不是视图。

    希望这会有所帮助。祝你好运

    【讨论】:

      猜你喜欢
      • 2012-01-09
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2014-06-02
      相关资源
      最近更新 更多