ruby – 将ActiveRecord与DelegateClass一起使用
发布时间:2020-12-17 02:03:18 所属栏目:百科 来源:网络整理
导读:使用rails 3.2.8我有一个带有几个属性的模型设置 class MyModel ActiveRecord::Base attr_accessible :foo,:barend 我有另一个类设置使用上面作为委托类 class MyModelPresenter DelegateClass(MyModel) def initialize(month,obj) @month = month super(obj
使用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应用程序中运行. 有没有人知道为什么没有定义模型的属性方法? 解决方法
从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,v) } end end 如您所见,我还必须添加def __getobj__方法.并将初始化程序中的@_sd_obj设置为我委托的类的实例. 请参见 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |