2

我在覆盖模型中的访问器并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),这将给出正确的值。我很惊讶在其他地方没有发现这个问题,但是有解决这个问题的方法吗?

4

1 回答 1

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 配合得很好。

于 2013-04-10T23:39:13.217 回答