【问题标题】:design advice: Gemify ActiveResource subclass设计建议:Gemify ActiveResource 子类
【发布时间】:2012-07-26 23:13:49
【问题描述】:
有人要求我在我们的 Rails 应用程序中使用多个 ActiveResource 子类构建 gem。
困难在于self.site 调用使用Rails 环境文件中的常量集(以便开发、测试和生产指向不同的网站)。将我的新 gem 添加到 Gemfile 后,我发现应用在环境文件之前加载 gem,因此我的 ActiveResource 模型破坏了应用。
我该怎么办?
规格:Rails 3.2.3、Ruby 1.9.3
【问题讨论】:
标签:
ruby-on-rails
activeresource
【解决方案1】:
我最终做的是覆盖 self.site 和 self.format 和 self.connection,让它们仅在第一次调用方法时查找环境常量:
module MyActiveResource
# A flag to indicate whether the environment variable has already been sought
attr_accessor :active_record_fields_set
# Set site & format if not set
def connection(refresh=false)
set_my_active_record_fields unless active_record_fields_set
super(refresh)
end
# Set site & format if not set
def site
set_my_active_record_fields unless active_record_fields_set
super
end
# Set site & format if not set
def format
set_my_active_record_fields unless active_record_fields_set
super
end
# Set site & format
def set_my_active_record_fields
self.active_record_fields_set = true
self.site = MY_CONSTANT
self.format = ActiveResource::Formats::XmlFormat
end
end
然后在我从ActiveResource::Base 继承的类中扩展MyActiveResource。