我的模型中有2个非数据库属性。如果其中一个有值,我需要在json响应中返回另一个:
class Car < ApplicationRecord
attr_accessor :max_speed_on_track
attr_accessor :track
def attributes
if !self.track.nil?
super.merge('max_speed_on_track' => self.max_speed_on_track)
end
end
end
问题是该行&#39; if!self.track.nil?&#39;控制器尝试返回json时抛出错误
也许有更好的方法,因为我读到使用attr_accessor是代码气味。
我想要做的是,如果用户将跟踪值作为查询参数传递给我,那么我将该值传递给模型,并使用它来计算max_speed_on_track
,并返回该值。 / p>
显然,如果用户没有提供曲目,那么我不想在json中返回max_speed_on_track
。
控制器方法现在非常基础(我仍然需要添加检查轨道参数的代码)。代码会在保存行上抛出错误。
def create
@car = Car.new(car_params)
if @car.save
render json: @car, status: :created
else
render json: @car.errors, status: :unprocessable_entity
end
end
答案 0 :(得分:1)
试试这个:
class Car < ApplicationRecord
attr_accessor :max_speed_on_track
attr_accessor :track
def as_json(options = {})
if track.present?
options.merge!(include: [:max_speed_on_track])
end
super(options)
end
end
由于Rails使用attributes
方法,并且您只需要这个用于json输出,因此您可以覆盖as_json
方法,就像在this article中一样。这将允许您在max_speed_on_track
存在时(而不是零)将track
方法包含在json输出中。