實際上,我有這個:
ip = HTTP.get("http://ip-api.com/json/24.48.0.1")
if ip.code == 200
Ipgeo.create(JSON.parse(ip.body).deep_symbolize_keys)
end
我想從 http 請求的 json 回應創建 Ipgeo 物件。http請求的屬性比我的物件多,所以引發的錯誤是:
ActiveModel::UnknownAttributeError: unknown attribute
有沒有辦法奏效?就像使用引數創建以排除未知屬性?或使用該物件的已知引數過濾我的json?
我想跳過以下程序:
ip = Ipgeo.new()
ip.country = JSON.parse(ip.body)["country"]
ip.lat = JSON.parse(ip.body)["lat"]
...
Or
ip = Ipgeo.create(
country: JSON.parse(ip.body)["country"]
...
)
uj5u.com熱心網友回復:
它中有一個column_names方法ActiveRecord回傳模型包含的列名串列(字串陣列)。如果您將此方法的結果傳遞給slice您,您將只獲得模型具有的屬性。
Ipgeo.create(JSON.parse(ip.body).slice(*Ipgeo.column_names))
UPD
正如評論中提到的@max,有一個白名單是件好事。
IPGEO_ATTRIBUTES = ['country', 'lat']
#...
Ipgeo.create(JSON.parse(ip.body).slice(*IPGEO_ATTRIBUTES))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/460246.html
