gpt4 book ai didi

ruby-on-rails - 从其 json 表示中获取 IPAddr 实例

转载 作者:行者123 更新时间:2023-11-29 12:58:34 25 4
gpt4 key购买 nike

如何从它的 json 表示中取回 IPAddr 实例?

上下文:

我正在开发一个使用 draftsman gem 的 Rails 应用程序。本质上,当一个人对数据库中的记录进行更改并且 ruby​​ 模型 has_drafts 时,不是立即对记录进行更改,而是将更改的草稿和结果记录保存在草稿表,直到一个publish!草稿。然后对实际记录进行更改。非常整洁:)

草稿表包含允许更改在 postgres 表中的 json 列中发生的对象。

我也在使用 Devise,我的用户模型使用 trackable 模块,其中包括一个 current_sign_in_ip 以及一个 last_sign_in_ip 列输入 inet

问题:

我的用户表中的

inet 类型列,以及 User 对象的其余部分,都存储在 draftsman< 创建的草稿表中 gem 在一个名为 object 的 json 列中。 reify在这种情况下,由于以下原因,从草稿中修改对象不会成功:IPAddr 实例具有 IPAddr 类的 json 表示无法感知。例如,Ruby 中的 IPAddr 实例响应 to_json,这给了我这样的东西:"\"family\":2,\"addr\":2130706433,\"mask_addr\":4294967295}"。这些实例也响应 to_s 并给我这样的东西:“127.0.0.1”。不幸的是,IPAddr 类似乎不知道如何从我所知道的 json 中恢复过来:

[277, 286] in /home/jake/.rvm/gems/ruby-2.2.1/bundler/gems/draftsman-1bd3c797d540/lib/draftsman/model.rb
277: data = {
278: :item => self,
279: :whodunnit => Draftsman.whodunnit,
280: :object => object_attrs_for_draft_record
281: }
=> 282: data = merge_metadata_for_draft(data)
283:
284: # If there's already a draft, update it.
285: if send(self.class.draft_association_name).present?
286: data[:object_changes] = changes_for_draftsman if track_object_changes_for_draft?

(byebug) data[:object]['current_sign_in_ip']
#<IPAddr: IPv4:127.0.0.1/255.255.255.255>
(byebug) data[:object]['current_sign_in_ip'].to_json
"{\"family\":2,\"addr\":2130706433,\"mask_addr\":4294967295}"

(byebug) IPAddr.new(data[:object]['current_sign_in_ip'].to_s)
#<IPAddr: IPv4:127.0.0.1/255.255.255.255>
(byebug) IPAddr.new(data[:object]['current_sign_in_ip'].to_json)
*** IPAddr::InvalidAddressError Exception: invalid address

nil
(byebug)

我认为将这个问题发布到 StackOverflow 会引起一些关注,但我还提交了一个 github issue如果需要任何其他信息,请访问 Draftsman github 页面。

最佳答案

不确定这是否有帮助,但如果您阅读我在 d_ethier 的回答下面的评论,您会发现 IPAddr 对 JSON 真的一无所知。

但是你可以像这样修改它来理解 JSON:

require 'active_model'
require 'active_support'
require 'active_support/core_ext'
require 'ipaddr'

class IPAddr
include ActiveModel::Serializers::JSON

attr_accessor :addr, :mask_addr, :family

def attributes=(hash)
hash.each do |key, value|
send("#{key}=", value)
end
end

def attributes
instance_values
end
end

p i = IPAddr.new('127.0.0.1')
p j = i.to_json
p IPAddr.new.from_json(j)

输出:

#<IPAddr: IPv4:127.0.0.1/255.255.255.255>
"{\"family\":2,\"addr\":2130706433,\"mask_addr\":4294967295}"
#<IPAddr: IPv4:127.0.0.1/255.255.255.255>

来源:
http://apidock.com/rails/ActiveModel/Serializers/JSON/from_json

关于ruby-on-rails - 从其 json 表示中获取 IPAddr 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36524506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com