Kev*_*tre 13 ruby coupling ruby-on-rails decoupling
我有一个模型,需要从辅助源加载外部数据.我的模型可以从(可交换)中获取数据的许多Web服务,但我不想创建难以更改服务的代码(成本因变量和固定使用而显着不同而且可能会发生变化将被要求).
我想创建一个驱动程序来执行交互(如果服务需要切换,则创建更多自定义驱动程序).不幸的是,由于驱动程序和模型的紧密耦合,将代码提取到插件或gem中是没有意义的.我已将所有代码解压缩到一个模块中(参见示例),并且当前在我的模型上面声明了代码.
module Synchronize
def refresh
self.attributes = ...
self.save
end
end
class Data < ActiveRecord::Base
include Synchronize
end
Run Code Online (Sandbox Code Playgroud)
Rails(3.0.0)是否有一个约定存储与模型紧密耦合的模块?我应该使用插件来执行此操作吗?这与'app/helpers'目录有关吗?如果没有,最适合存储代码的地方在哪里?谢谢!
Sid*_*ane 27
你是对的,如果模块与特定模型紧密耦合,那么它不适合作为gem/plugin.
app/helpers /用于视图辅助方法,不应包含仅用于混合到模型中的模块.
你可以把模块放在lib /中的一个地方.这适用于在app /中任何地方都不适合的代码,并且在将代码移动到插件之前通常是松散耦合代码的初始主页(但这不是一个硬性规则).但是,由于您的模块与模型紧密耦合,因此lib /可能不是最适合它的模块.
我知道37signals(和其他人)使用"关注点"的概念作为保持模块中相关模型代码组织的一种方式.这是通过创建app/concerns /并将模块放在那里来实现的.然后将该目录添加到app/application.rb(对于Rails 2的config/environment.rb)中的应用程序的加载路径中:
config.load_paths += %W(#{Rails.root}/app/concerns)
Run Code Online (Sandbox Code Playgroud)
然后可以将模块正常混合到模型中.
这是Jamis Buck关于此的原始博客文章 - http://weblog.jamisbuck.org/2007/1/17/concerns-in-activerecord
我个人更喜欢的另一个变体,虽然它不涉及模块,但使用这个插件:http: //github.com/jakehow/concerned_with
希望有所帮助.