Rails 5:attr_accessor抛出NoMethodError(未定义的方法`keys' for nil:NilClass):

时间:2017-03-02 20:41:16

标签: ruby-on-rails json attr

我的模型中有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

1 个答案:

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