使用rails 3.2.8我有一个带有几个属性的模型设置
class MyModel < ActiveRecord::Base
attr_accessible :foo, :bar
end
我使用上面的另一个类设置作为委托类
class MyModelPresenter < DelegateClass(MyModel)
def initialize(month, obj)
@month = month
super(obj)
end
def self.build(month, attributes = { })
new(month, MyModel.new).tap do |p|
p.attributes = attributes
end
end
def attributes=(attributes)
attributes.each { |k, v| send("#{k}=", v) }
end
end
当我像这样创建一个新的MyModelPresenter时:
MyModelPresenter.build(Date.today, {:foo => 1})
我得到以下回复
NoMethodError: undefined method `foo=' for #<MyModel:0x1098f31a8>
from /Users/me/.rbenv/versions/ree-1.8.7-2011.03/lib/ruby/gems/1.8/gems/activemodel-3.2.8/lib/active_model/attribute_methods.rb:404:in `method_missing'
from /Users/me/.rbenv/versions/ree-1.8.7-2011.03/lib/ruby/gems/1.8/gems/activerecord-3.2.8/lib/active_record/attribute_methods.rb:149:in `method_missing'
from /Users/me/dev/temp/app/presenters/my_model_presenter.rb:23:in `send'
from /Users/me/dev/temp/app/presenters/my_model_presenter.rb:23:in `attributes='
from /Users/me/dev/temp/app/presenters/my_model_presenter.rb:23:in `each'
from /Users/me/dev/temp/app/presenters/my_model_presenter.rb:23:in `attributes='
from /Users/me/dev/temp/app/presenters/my_model_presenter.rb:17:in `build'
from /Users/me/dev/temp/app/presenters/my_model_presenter.rb:15:in `tap'
from /Users/me/dev/temp/app/presenters/my_model_presenter.rb:15:in `build'
由于某种原因,未定义模型上的数据库属性(setter或getter)。在升级到rails 3.2之前,这一切都在rails 3.1应用程序中运行。
有没有人知道为什么没有定义模型的属性方法?
答案 0 :(得分:1)
继承Delegator
而非使用DelegateClass
解决了这个问题。这是最后一堂课的样子:
class MyModelPresenter < Delegator
def initialize(month, obj)
@month = month
super(obj)
@_sd_obj = obj
end
def __getobj__
@_sd_obj
end
def self.build(month, attributes = { })
new(month, MyModel.new).tap do |p|
p.attributes = attributes
end
end
def attributes=(attributes)
attributes.each { |k, v| send("#{k}=", v) }
end
end
如您所见,我还必须添加def __getobj__
方法。并在初始化程序中将@_sd_obj
设置为我委托的类的实例。
请参阅SimpleDelegator
示例。