2011-06-01 31 views
2

基本上,我正在编写一个与许多热门网站(Facebook,Twitter,Youtube等)接口的网站。我的主要目标是相同的,但是我实现我的目标的方式与我支持的每个站点都不同,因为它们的布局不同,并且我必须根据其网站的运行情况编写我的请求。如何模块化Rails代码?

用户选择他们想要使用我提供的服务的特定网站(即,他们是否希望将其用于Facebook或Twitter等)。他们只能根据我的服务请求选择这些网站中的一个。

我想知道当Rails模块化(这是我的第一个Rails项目,尽管我已经接触过其他语言),好的设计主体/实践是什么。基本上,我看到它的方式是,用户将他们的请求提交给我的控制器,它将检查他们选择的站点。然后,我的控制器将“加载”一个特定的模块(即如果他们选择了Facebook,它将加载facebook模块),其中将包含处理Facebook请求的所有代码。然后它将以任何必要的方式调用该代码,并将结果提供给用户。

所以基本上,我的问题是真正归结为有关Rails的最佳实践和设计原则。您认为在这种情况下分离我的代码的好方法是什么?我是否应该为每个支持的网站开设一个班级(脸书,推特等)?这是我能想到的唯一真正的选择(因为我对Rails不是很熟悉),但是我确信会有更好的选择,所以我可以限制代码冗余的数量,因为每个类的目标将是相同的,它只是一个不同的技术来获得目标(即方法名称将是相同的每个类,等)。

谢谢!

回答

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 
+0

谢谢steenslag,这听起来很完美:)!如果有人知道这种事情会在轨道中出现,我就全部定下来。我唯一的猜测是在/ lib目录中,但我可能是错的。 – b0xxed1n 2011-06-01 14:35:45

1

这是一个主观问题,它取决于你想添加多少功能,以及它们有多复杂。关于使用外部apis,我很确定每个都有api连接宝石。如果你不喜欢它们,你可以使用ActiveResource,这对于REST API来说非常有用。另外,我建议观看关于ActiveResource的这些截屏视频。

关于您的应用程序的结构,我会用namespaces保持你的控制器和路线,每条路线模块上很好的分离。

+0

感谢您的回答。那么,我会在命名空间中使用控制器吗?例如说,以下内容: support_websites_controller.rb: 命名空间的Facebook做 结束 命名空间的Youtube做 结束 等? – b0xxed1n 2011-06-01 13:36:08

+0

这取决于你的网站是关于什么。如果每个api都有类似的功能,命名空间可以帮助您识别控制器。例如,如果你对每个api有不同的首选项,你将在不同的命名空间中有多个'preferences_controller.rb'。一个在facebook名称空间中,另一个在twitter名称空间中。 – dombesz 2011-06-01 14:27:10