我在模型中覆盖访问器并稍后在模型上使用to_xml
方法时遇到问题。问题是,to_xml
似乎使用默认的getter方法,而不是使用read_attribute
。
我的模特:
class Announcement < ActiveRecord::Base
...
def created_at
date = self[:created_at]
"#{german_date(date)} #{german_time(date)} #{I18n.t(:clock)}"
end
...
end
我正在使用它,通过始终为标签和text_fields提供正确的方法,以便在haml视图中轻松运行参数。因为我需要修改一些属性,所以我覆盖了访问者。
-# Minified example ...
= form_for ...
- %i(a b c d e).each do |attr|
= f.label attr
= f.text_field attr
问题是:当我运行to_xml
时,我遇到了这个问题:
NoMethodError: undefined method `xmlschema' for "15.03.2009 18:17 Uhr":String
显然,to_xml
正在使用我的自定义getter而非read_attribute(:created_at)
,这将提供正确的值。我很惊讶在其他地方没有发现这个问题,但是有没有解决这个问题的方法?
答案 0 :(得分:1)
有一种方法可以使用选项和带有to_xml
announcment.to_xml(except: :created_at, procs: -> (options, record) {
options[:builder].tag!("created-at", record.read_attribute(:created_at))
})
但这并不漂亮。我只会使用装饰器来查看视图并单独保留模型属性方法,Draper可以很好地使用Rails 4。