Rails 5:attr_accessor 抛出 NoMethodError(nil:NilClass 的未定义方法“键”):
Rails 5: attr_accessor throwing NoMethodError (undefined method `keys' for nil:NilClass):
我的模型中有 2 个非数据库属性。如果其中一个有值,我需要 return 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
问题是当控制器尝试 return json
时,行 'if !self.track.nil?' 抛出错误
也许有更好的方法,因为我读到使用 attr_accessor 是一种代码味道。
我想做的是,如果用户将跟踪值作为查询参数传递给我,然后我将该值传递给模型,它使用它来计算 max_speed_on_track
和 return那个值。
显然,如果用户没有提供曲目,那么我不想 return max_speed_on_track
在 json.
控制器方法目前非常基础(我仍然需要添加检查轨道参数的代码)。代码在保存行上抛出错误。
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
试试这个:
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。这将允许您在 track
存在(不是零)时将 max_speed_on_track
方法包含在 json 输出中。
我的模型中有 2 个非数据库属性。如果其中一个有值,我需要 return 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
问题是当控制器尝试 return json
时,行 'if !self.track.nil?' 抛出错误也许有更好的方法,因为我读到使用 attr_accessor 是一种代码味道。
我想做的是,如果用户将跟踪值作为查询参数传递给我,然后我将该值传递给模型,它使用它来计算 max_speed_on_track
和 return那个值。
显然,如果用户没有提供曲目,那么我不想 return max_speed_on_track
在 json.
控制器方法目前非常基础(我仍然需要添加检查轨道参数的代码)。代码在保存行上抛出错误。
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
试试这个:
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。这将允许您在 track
存在(不是零)时将 max_speed_on_track
方法包含在 json 输出中。