Ruby on Rails 将模型属性公开为json

示例

要将地址配置文件字段显示为Google映射上的标记,需要将地址字段对象作为json对象传递给javascript。

常规数据库属性

当调用to_json一个上ApplicationRecord对象,数据库属性将自动曝光。

给定一个ProfileFields::Address模型label,value,longitude和latitude属性,address_field.as_json导致Hash如表示,

address_field.as_json  # =>
  {label: "Work address", value: "Willy-Brandt-Straße 1\n10557 Berlin",
    longitude: ..., latitude: ...}

通过以下方式将其转换为json字符串to_json:

address_field.to_json  # =>
  "{\"label\":\"Work address\",\"value\":\"Willy-Brandt-Straße 1\\n
    10557 Berlin\",\"longitude\":...,\"latitude\":...}"

这很有用,因为它允许在javascript中使用label和value,例如,以显示映射标记的工具提示。

其他属性

其他虚拟属性可以通过重写as_json方法来公开。

例如,要公开title属性,请将其包含在合并的as_json哈希中:

# app / models / profile_fields / address.rb
class ProfileFields::Address < ProfileFields::Base
  # ...

  # For example: "John Doe, Work address"
  def title
    "#{self.parent.name}, #{self.label}"
  end

  def as_json
   super.merge{
      title: self.title
    }
  end
end

上面的示例用于super调用原始as_json方法,该方法返回对象的原始属性哈希,并将其与所需的位置哈希合并。

要理解之间的区别as_json和to_json,看看通过jjulian这个博客帖子。

位置

要呈现标记,默认情况下,谷歌映射api需要一个position哈希值,该哈希值的经度和纬度分别存储为lng和lat。

此位置哈希可以在javascript中,以后或在定义地址字段的json表示形式时创建:

要将其提供position为地址字段的json属性,只需覆盖as_json模型上的方法即可。

# app / models / profile_fields / address.rb
class ProfileFields::Address < ProfileFields::Base
  # ...

  def as_json
   super.merge{
      # ...
      position: {
        lng: self.longitude,
        lat: self.latitude
      }
    }
  end
end