如何模块化Rails代码?

时间:2011-06-01 12:53:55

标签: ruby-on-rails ruby ruby-on-rails-3

基本上,我正在编写一个与许多热门网站(Facebook,Twitter,Youtube等)接口的网站。我的主要目标是相同的,但是我实现目标的方式对于我支持的每个站点都是不同的,因为它们的布局不同,因为我必须根据他们网站的运作来编写我的请求。

用户选择他们想要使用我提供的服务的特定网站(即他们是想将它用于Facebook,还是用于推特等)。他们只能根据我的服务请求选择其中一个网站。

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

基本上,我的问题实际上归结为关于Rails的最佳实践和设计原则。在这种情况下,您如何看待分离我的代码的好方法?我应该为每个支持的网站(facebook,twitter等)提供课程吗?这是我能想到的唯一真正的选择(因为我对Rails不是很熟悉),但我确信会有更好的选择,所以我可以限制代码冗余量,作为每个类的目标将是相同的,它只是一个不同的技术来获得目标(即每个类的方法名称将是相同的等)。

谢谢!

2 个答案:

答案 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来保持你的控制器和路由在每个模块上分离。