基本上,我正在编写一个与许多流行网站(Facebook、Twitter、Youtube等)对接的网站。我的主要目标是一样的,但对于我支持的每个网站,我实现目标的方式都会有所不同,因为它们的布局不同,而且我必须根据它们网站的工作情况编写请求脚本。
用户选择他们想使用我提供的服务的特定网站(即,他们想将其用于facebook还是twitter等)。他们每次请求我的服务只能选择其中一个网站。
当谈到Rails模块化时,我想知道什么是好的设计原则/实践(这是我的第一个Rails项目,尽管我接触过很多其他语言)。基本上,在我看来,用户会向我的控制器提交他们的请求,控制器会检查他们选择的网站。然后,我的控制器将"加载"一个特定的模块(即,如果他们选择facebook,它将加载facebook模块),该模块将包含处理facebook请求的所有代码。然后,它将以任何必要的方式调用此代码,并将结果提供给用户。
所以,基本上,我的问题实际上是关于Rails的最佳实践和设计原则。在这种情况下,你认为如何分离我的代码是一个好方法?我应该为我支持的每个网站(脸书、推特等)上一节课吗?这是我能想到的唯一一个真正的选择(因为我对Rails不是很熟悉),但我相信会有更好的选择,所以我可以限制代码冗余的数量,因为每个类的目标都是相同的,这只是获得目标的不同技术(即,每个类的方法名称都相同,等等)。
谢谢!
对我来说,这是一种策略模式。你可以这样做(不确定把它放在Rails中的哪里)。
require "delegate"
class Youtube
def open_connection
#code to open connection with youtube
end
def do_stuff
puts "doing stuff on Youtube"
end
def close_connection
#code to close connection
end
end
class Facebook
#define the same methods here
end
class Service < SimpleDelegator
def hello
puts "Hello, I stole most of my methods from #{__getobj__}"
end
end
s = Service.new(Youtube.new)
s.hello #=> Hello, I stole most of my methods from #<Youtube:0xb7724b1c>
s.do_stuff #=> doing stuff on Youtube
这是一个主观问题,取决于你想添加多少功能,以及它们有多复杂。关于使用外部api,我确信每个api都有api连接宝石。如果您不喜欢它们,可以只使用ActiveResource
,它与RESTapi配合得很好。此外,我还建议大家看这些关于ActiveResource
的电影。
- http://railscasts.com/episodes/94-activeresource-basics
- http://railscasts.com/episodes/95-more-on-activeresource
关于您的应用程序结构,我将使用名称空间在每个模块上保持控制器和路由的良好分离。