应包含在JSON序列化中的自定义模型方法

时间:2012-05-30 17:20:23

标签: ruby-on-rails ruby-on-rails-3 json model

我正在使用javascript库来构建组合框。 我要求用一个人的全名构建一个组合框,所以我的意思是名字+姓氏。

因为在数据库中那些是2个单独的字段(在我的模型中也是如此),我想知道是否有一种快速方式(而不是手动构建所有哈希对象)来“模拟”其他字段的存在我的JSON转换模型,因为此对象必须作为JSON数组返回,您可以在其中读取* full_name *作为键。

感谢您的帮助

3 个答案:

答案 0 :(得分:10)

您可以通过传递:methods选项并调用super来覆盖模型中的to_json方法。这将使用as_json选项调用超级类的:methods版本,以便它使用full_name属性序列化您的模型。

class Person < ActiveRecord::Base
  def as_json(options={})
    options[:methods] = [:full_name]
    super
  end

  def full_name
    "#{first_name} #{last_name}"
  end
end

在控制器内部,您可以简单地

render :json => @person

如果您想了解可以传递给as_json方法的更多选项,请查看此文档。 http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html

答案 1 :(得分:1)

这似乎是这个问题的重复:

Rails 3 respond_to json, with custom attributes/methods

具体是:方法哈希:

respond_with({
  :cars => @cars.as_json(:only => [:make, :model], :methods => [:full_name]),
  :vans => @vans
})

答案 2 :(得分:-1)

你可以做的是在你的User类中有一个setter方法,如此

def full_name=(string)
  names = string.split # the default delimiter is a space
  self.update_attributes(:first_name => names[0], :last_name => names[1])
end

然后表单应该引用:full_name作为字段,即使它不是实际列,Rails也会自动访问上面的方法并执行它,从而更新你真正想要的列。