我正在基于表示Rails模型的JSON对象呈现视图。这个JSON对象需要不属于Rails模型的字段,因此我将它们添加到控制器中,如下例1所示:
#Controller
events = Event.where(<query>).each do |event|
event[:duration] = (event.end - event.start)/3600
event[:datatime] = event.start.hour + event.start.min/60.0
...
end
render json: events
这会正确呈现我的数据。但是,我收到以下弃用警告:
DEPRECATION WARNING: You're trying to create an attribute `duration'. Writing arbitrary attributes on a model is deprecated. Please just use `attr_writer` etc.
我想重写我的代码以避免此警告。如果我尝试将这些额外字段视为标准对象属性,则无法正确呈现这些值。以下是我尝试更改为使用标准对象属性:
#Controller
events = Event.where(<query>).each do |event|
event.duration = (event.end - event.start)/3600
event.datatime = event.start.hour + event.start.min/60.0
...
end
render json: events
#Model
class Event < ActiveRecord::Base
include ActiveModel::AttributeMethods
attr_accessor :duration, :datatime
这会导致字段填充undefined
。如果我使用attr_writer
而不是attr_accessor
,则会出现这种情况。我该如何解决这个问题?我是否被迫将这些临时属性存储在数据库中,或者我只是使用了错误的语法?
答案 0 :(得分:3)
如果您想阅读和编写访问者,请使用attr_accessor
:
class Event < ActiveRecord::Base
attr_accessor :duration, :datatime
end
您无需包含ActiveModel::AttributeMethods
即可使用attr_accessor
。
要在JSON告诉渲染中包含访问器以包含它们:
render json: events, methods: [:duration, :datatime]