我正在研究类似社交网络的东西;我正在使用来自各种网站的不同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埋入其中也很难看......
所以我不知道该怎么做。有什么想法吗?
答案 0 :(得分:8)
首先,您应该将所有数据存储和数据收集方法放入资源和模型中,以便可以从所有控制器访问它们。您可以在单个控制器中保留内部数据变更操作。一旦你有这样的组织,你可以做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
答案 1 :(得分:6)
首先,您应该将所有数据存储和数据收集方法放入资源和模型中,以便可以从所有控制器访问它们。您可以在单个控制器中保留内部数据变更操作。一旦你有这样的组织,你可以做Hobo所做的事情:只为头版创建一个控制器,如果你愿意,创建一个“front_controller”。在这里,您可以显示从所有模型和资源收集的数据,以及指向其他控制器操作的链接。
答案 2 :(得分:4)
我想你应该读一下rails'MVC architecture。
在我看来,你忽略了M(odel)部分。模型应该保存数据,因此是您应用程序中最重要的部分。
这些是更好地组织模型和控制器的一些interesting thoughts(胖模型,瘦控制器是一条经验法则。
由于您说您正在使用其他API(如lastfm和twitter),您可能需要查看this railscast关于创建非ActiveRecord模型(模型)与数据库无关的)
如果您还为用户提供API,我建议使用RESTful方法,因为一旦掌握了它,它就可以很容易地开发和维护。
您应该阅读有关resources的更多信息,因为您的localhost/lastfm
和localhost/twitter
是资源,不是视图。
希望这会有所帮助。祝你好运