ruby-on-rails - 如何模块化Rails代码?

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

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

用户选择他们想要使用我提供的服务的特定网站(即他们想要将其用于 Facebook 或 Twitter 等)。他们每次请求我的服务时只能选择其中 1 个网站。

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

所以基本上,我的问题实际上归结为 Rails 的最佳实践和设计原则。您认为在这种情况下分离代码的好方法是什么?我应该为我支持的每个网站(facebook、twitter 等)开设一门类(class)吗?这是我能想到的唯一真正的选择(因为我对 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

关于ruby-on-rails - 如何模块化Rails代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6201449/

相关文章:

ruby-on-rails - rails - 搜索 Controller

ruby-on-rails - Rails 有没有办法管理有序列表?这样每个项目都有一个位置,如果删除一个元素,位置会自动更新吗?

ruby-on-rails - Rails 控制台 : Run a Ruby file several times

ruby-on-rails - 帮我重构这个讨厌的 Ruby if/else 语句

ruby-on-rails - 将移动版本添加到 Rails 网站的最佳方式

ruby - Rails 3.1 和 MongoDB - ActiveRecords?

html - 具有外部变量的 HAML 中的元描述

ruby-on-rails - Rails 3 中的 config.logger 和 config.paths.log

ruby-on-rails - rspec工厂女孩协会

ruby-on-rails - 从数组中删除键并使其持久的最快方法