要将地址配置文件字段显示为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