Rails - 使用 JSON 从控制器返回带有对象的附加属性

Mic*_*tor 3 attributes controller model ruby-on-rails

这是我的人员控制器中用于创建操作的代码:

def create
  @person = Person.new(person_params)
  @person.branch_id = session[:branch_id]
  @person.added_by = current_user.id
  if @person.save
    respond_to do |format|
      format.json { render json: @person}
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我在我的人模型中有一个方法来获取人的全名:

def full_name
    [self.first_name, self.middle_name, self.last_name].reject(&:blank?).join(" ")
end
Run Code Online (Sandbox Code Playgroud)

当 @person 作为 JSON 对象返回时,将其全名添加到 @person 的最佳方法是什么

irr*_*ncu 5

由于您希望它在 JSON 中,您可以覆盖类的as_json方法Person以包含添加full_name方法的选项:

def as_json(options = {})
  super options.merge(methods: [:full_name])
end
Run Code Online (Sandbox Code Playgroud)

每当对象应该序列化为 JSON 字符串时,Rails 就会使用此方法,例如通过render json: @person. 如果您只想在这种情况下添加额外的方法,您也可以直接使用内联调用它,render json: @person.as_json(methods: [:full_name])或者如果您想对 JSON 输出进行更复杂的自定义,您可以考虑使用专用的序列化器类,例如使用ActiveModel: :序列化宝石。但是,由于您只想添加一个方法并且可能在您正在序列化的任何地方添加@person,因此您的情况的最佳方法是as_json按照开头所述进行覆盖。