我正在使用来自第三方API的JSON数据,对该数据进行一些处理,然后将模型作为JSON发送到客户端。传入数据的键名称不是很好。其中一些是首字母缩写词,有些似乎是随机字符。例如:
{
aikd: "some value"
lrdf: 1 // I guess this is the ID
}
我正在创建一个rails ActiveResource模型来包装这个资源,但不想通过model.lrdf访问这些属性,因为它不是lrdf真正的内容!相反,我想用某种方法将这些属性别名化为另一个名为better的属性。所以我可以说model.id = 1并自动将lrdf设置为1或者放入model.id并自动返回1.此外,当我调用model.to_json将模型发送给客户端时,我不想要我的javascript必须要理解这些奇怪的命名约定。
我试过
alias id lrdf
但是这给了我一个错误,说方法lrdf不存在。
另一种选择是仅包装属性:
def id
lrdf
end
这样可行,但是当我调用model.to_json时,我再次看到lrdf作为键。
以前有人做过这样的事吗?你推荐什么?
答案 0 :(得分:1)
你尝试过一些before_save魔法吗?也许您可以定义attr_accessible:ldrf,然后在您的before_save过滤器中,将ldrf分配给您的id字段。没试过,但我认为它应该有用。
attr_accessible :ldrf
before_save :map_attributes
protected
def map_attributes
{:ldrf=>:id}.each do |key, value|
self.send("#{value}=", self.send(key))
end
end
让我知道!
答案 1 :(得分:0)
您可以尝试基于ActiveResource :: Formats :: JsonFormat创建格式化程序模块并覆盖decode()。如果必须更新数据,则还必须覆盖encode()。查看本地gems / activeresource-N.N.N / lib / active_resource / formats / json_format.rb以查看原始json格式化程序的功能。
如果您的模型名称为Model且格式化程序为CleanupFormatter,则只需执行Model.format = CleanupFormatter。
module CleanupFormatter
include ::ActiveResource::Formats::JsonFormat
extend self
# Set a constant for the mapping.
# I'm pretty sure these should be strings. If not, try symbols.
MAP = [['lrdf', 'id']]
def decode(json)
orig_hash = super
new_hash = {}
MAP.each {|old_name, new_name| new_hash[new_name] = orig_hash.delete(old_name) }
# Comment the next line if you don't want to carry over fields missing from MAP
new_hash.merge!(orig_hash)
new_hash
end
end
这并不像你要求的那样涉及别名,但我认为将你的模型中的乱码名称隔离开来是很有帮助的,这些名字永远不会知道那些原始名称。 “to_json”将显示可读的名称。