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