基本上,我正在编写一个与许多热门网站(Facebook,Twitter,Youtube等)接口的网站。我的主要目标是相同的,但是我实现目标的方式对于我支持的每个站点都是不同的,因为它们的布局不同,因为我必须根据他们网站的运作来编写我的请求。
用户选择他们想要使用我提供的服务的特定网站(即他们是想将它用于Facebook,还是用于推特等)。他们只能根据我的服务请求选择其中一个网站。
我想知道在Rails模块化方面有什么好的设计原则/实践(这是我的第一个Rails项目,虽然我已经接触过很多其他语言)。基本上,我看到它的方式是,用户将他们的请求提交给我的控制器,这将检查他们选择的网站。然后我的控制器将“加载”一个特定的模块(即,如果他们选择了facebook,它将加载facebook模块),它将包含处理Facebook请求的所有代码。然后,它将以任何必要的方式调用此代码,并将结果提供给用户。
基本上,我的问题实际上归结为关于Rails的最佳实践和设计原则。在这种情况下,您如何看待分离我的代码的好方法?我应该为每个支持的网站(facebook,twitter等)提供课程吗?这是我能想到的唯一真正的选择(因为我对Rails不是很熟悉),但我确信会有更好的选择,所以我可以限制代码冗余量,作为每个类的目标将是相同的,它只是一个不同的技术来获得目标(即每个类的方法名称将是相同的等)。
谢谢!
答案 0 :(得分:3)
看起来像我的策略模式。你可以这样做(不知道把它放在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
答案 1 :(得分:1)
这是一个主观问题,它取决于您想要添加多少功能,以及它们有多复杂。关于使用外部apis,我很确定每个都有api连接宝石。如果你不喜欢它们,你可以使用ActiveResource
,它与REST apis一起使用。另外,我建议观看这些关于ActiveResource
的截屏视频。
关于你的应用程序结构,我会使用namespaces来保持你的控制器和路由在每个模块上分离。