2010-09-23 57 views
13

我有一个模型,需要从辅助源加载外部数据。存在许多Web服务,我的模型可以从(可交换的)中获取数据,但是我不想创建代码,从而难以更改服务(成本因可变和固定使用而显着不同,并且可能会发生变化将被要求)。使用模块在导轨应用中的模型

我想创建一个驱动程序来执行交互(然后创建更多的自定义驱动程序,如果服务需要切换)。不幸的是,由于驱动程序和模型的紧密耦合,将代码提取到插件或gem中没有任何意义。我已经将所有代码提取到模块中(请参阅示例),并且目前已将代码声明在我的模型上方。

module Synchronize 
    def refresh 
    self.attributes = ... 
    self.save 
    end 
end 

class Data < ActiveRecord::Base 
    include Synchronize 
end 

Rails(3.0.0)有一个用于存储与模型紧密耦合的模块的约定吗?我应该使用插件来做到这一点吗?这与'app/helpers'目录有关吗?如果不是,最适合存储代码的地方在哪里?谢谢!

回答

27

你是对的,如果模块紧密耦合到特定的模型,那么它不是一个好的gem /插件候选人。

app/helpers /用于查看帮助程序方法,不应包含仅用于混入模型的模块。

一个地方你可以把模块放在lib /中。这适用于在app /中任何地方都不适合的代码,并且在它被移动到插件之前(通常不是最简单的代码),它通常是松散耦合代码的初始版本。但是,由于您的模块与您的模型紧密耦合,因此lib /可能不是最适合它的地方。

我知道37signals(和其他人)使用“关注”的概念作为保持模块中组织相关模型代码的一种方式。这是通过创建应用/关注/并将模块放在那里来实现的。然后该目录被添加到应用程序的负载路径中配置/ application.rb中(为Rails配置/ environment.rb文件2):

config.load_paths += %W(#{Rails.root}/app/concerns) 

该模块然后可混入模型为正常。

这里有一个关于这个原始博客文章通过了Jamis巴克 - http://weblog.jamisbuck.org/2007/1/17/concerns-in-activerecord

的这另一种变化,我个人比较喜欢,虽然它不涉及模块,使用此插件: http://github.com/jakehow/concerned_with

希望帮助。

3

此链接帮助我解决这个问题。

http://ander.heroku.com/2010/12/14/concerns-in-rails-3/

我曾经在一个模型/ extensions目录一直坚持它。关注目录是有道理的,但“关注”这个词对我来说并不明显。也许它会在我身上增长。

我还添加了扩展路径在application.rb中

config.autoload_paths += %W(#{config.root}/app/models/extensions)