將模型屬性公開為 json
要在 Google 地圖上將地址配置檔案欄位顯示為標記,需要將地址欄位物件作為 json 物件傳遞給 javascript。
常規資料庫屬性
在 ApplicationRecord
物件上呼叫 to_json
時,會自動公開資料庫屬性。
給定 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: ...}
由 to_json
轉換為 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