【问题标题】:How to modularize Rails code?如何模块化 Rails 代码?
【发布时间】:2011-06-01 22:31:03
【问题描述】:

基本上,我正在编写一个与许多流行网站(Facebook、Twitter、Youtube 等)交互的网站。我的主要目标是相同的,但是对于我支持的每个网站,我实现目标的方式会有所不同,因为它们的布局不同,而且我必须根据他们网站的运作情况编写我的请求。

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

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

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

    对我来说看起来像是策略模式。你可以这样做(不知道把它放在 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
    

    【讨论】:

    • 感谢 steenslag,这听起来很完美 :)!如果有人知道这种事情会在哪里发生,我已经准备好了。我唯一的猜测是在 /lib 目录中,但我可能错了。
    【解决方案2】:

    这是一个主观问题,取决于您要添加多少功能,以及它们的复杂程度。关于使用外部 api,我很确定每个都有 api 连接 gem。如果你不喜欢它们,你可以只使用ActiveResource,它与 REST api 配合得很好。我还建议观看这些关于ActiveResource 的截屏视频。

    关于你的应用程序结构,我会使用namespaces 来保持你的控制器和路由在每个模块上很好地分开。

    【讨论】:

    • 感谢您的回答。那么,我会在命名空间中使用控制器吗?例如,以下内容:support_websites_controller.rb: namespace Facebook do end namespace Youtube do end etc?
    • 这取决于您的网站是关于什么的。如果您对每个 api 命名空间都有类似的功能,可以帮助您识别您的控制器。例如,如果您对每个 api 有不同的偏好,您将在不同的命名空间中有多个 preferences_controller.rb。一个在 facebook 命名空间中,一个在 twitter 命名空间中等等。
    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 2011-12-29
    • 2014-05-23
    • 2021-02-05
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多