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 输出中。