6

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

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

感谢帮助

4

3 回答 3

11

您可以通过传递:methodsoptions 和 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

于 2012-05-30T17:30:20.357 回答
2

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

Rails 3 respond_to json,带有自定义属性/方法

特别是 :methods 哈希:

respond_with({
  :cars => @cars.as_json(:only => [:make, :model], :methods => [:full_name]),
  :vans => @vans
})
于 2012-05-30T17:27:35.607 回答
-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 也会自动访问上面的这个方法并执行它,从而更新你真正想要的列。

于 2012-05-30T17:26:08.740 回答