如何解决重命名ActiveResource属性
| 我正在使用来自第三方API的JSON数据,对该数据进行一点处理,然后将模型作为JSON发送到客户端。传入数据的键名不是很好。其中有些是首字母缩写词,有些似乎只是随机字符。例如:{
aikd: \"some value\"
lrdf: 1 // I guess this is the ID
}
我正在创建一个Rails ActiveResource模型来包装此资源,但是不希望通过model.lrdf访问这些属性,因为lrdf到底是什么并不明显!相反,我想以某种方式将这些属性别名为另一个命名更好的属性。我可以说model.id = 1并具有将lrdf自动设置为1或将model.id并具有自动返回1的功能。另外,当我调用model.to_json将模型发送给客户端时,我不想我的JavaScript必须了解这些奇怪的命名约定。
我试过了
alias id lrdf
但这给了我一个错误,说方法lrdf不存在。
另一个选择是只包装属性:
def id
lrdf
end
这有效,但是当我调用model.to_json时,我再次将lrdf视为键。
有人做过这样的事吗?你有什么建议吗?
解决方法
您是否尝试过使用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
让我知道!
,您可以尝试基于ActiveResource :: Formats :: JsonFormat创建一个格式化程序模块,并覆盖encode()。如果必须更新数据,则还必须重写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 \”将显示可读的名称。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。