我正在使用一个 javascript 库来构建组合框。我有建立一个人全名的组合框的要求,所以我的意思是名字+姓氏。
因为在数据库中这些是 2 个单独的字段(在我的模型中也是如此),我想知道是否有一种快速的方法(而不是手动构建所有哈希对象)来“模拟”我的模型中存在的附加字段JSON 转换,因为此对象必须作为 JSON 数组返回,您可以在其中读取 *full_name* 作为键。
感谢帮助
我正在使用一个 javascript 库来构建组合框。我有建立一个人全名的组合框的要求,所以我的意思是名字+姓氏。
因为在数据库中这些是 2 个单独的字段(在我的模型中也是如此),我想知道是否有一种快速的方法(而不是手动构建所有哈希对象)来“模拟”我的模型中存在的附加字段JSON 转换,因为此对象必须作为 JSON 数组返回,您可以在其中读取 *full_name* 作为键。
感谢帮助
您可以通过传递:methods
options 和 call来覆盖模型中的 to_json 方法super
。这将使用选项调用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
这似乎是这个问题的重复:
Rails 3 respond_to json,带有自定义属性/方法
特别是 :methods 哈希:
respond_with({
:cars => @cars.as_json(:only => [:make, :model], :methods => [:full_name]),
:vans => @vans
})
你可以做的是在你的 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 也会自动访问上面的这个方法并执行它,从而更新你真正想要的列。