- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在使用 ActiveModel::Dirty跟踪表单中所做的更改。现在一切都如我所料。对于像电话号码这样的东西,当在表单中时,我只是简单地格式化它们,然后电话号码将不会出现在 .changed
列表中,这是预期的行为。
但是我遇到了一个问题,我在我的 Profile 模型中使用了一个 jsonb 字段。所以问题是 ActiveModel 会将 JSONB 字段列为已更改,即使我专门对其进行格式化以匹配它之前的外观。这不是预期的行为。更奇怪的是,我拥有的另一个 JSONB 专栏并没有经历过这种疯狂。
我遇到问题的 JSONB 字段看起来像这样
store_accessor :user_details, :names, :other_field
store_accessor :bank_details, :bank_city, :bank_nameuser_details
和 bank_details
是 jsonb 列。需要注意的一些事情:names 是一个数组,other_field 是一个字符串。bank_city 和 bank_name 是字符串。
任何人都可以深入了解为什么 :user_details 特别是在努力解决这个问题而不是 :bank_details JSON 列吗?
我怀疑这可能是因为我在 :user_details 中使用了一个数组,我怀疑比较在 ActiveModel 源代码的某处被忽略了,但也许我错了?
编辑:我发现这肯定是因为我正在为 :names 使用数组。我将其更改为字符串,它不再认为 JSON 列已更改。打算深入研究 ActiveModel 源代码,看看我是否能找到原因。
编辑#2:出于某种原因,我认为我什么都不做就解决了这个问题,但我是个傻瓜,我意识到我已经删除了表格中的一些东西。所以这个问题对我来说仍然没有解决。任何见解都会令人惊叹。我无法通过查看 ActiveModel::Dirty 源代码来弄清楚为什么会这样。我不完全确定在哪里看。打算加入 byebugs 以查看是否有帮助。
编辑#3:重复此问题的步骤
创建一个带有 JSONB 列的 Rails 模型。设置商店访问器,您只需要一个即可。使用验证器或格式化程序将其默认设置为空数组。为您的模型提供 ActiveModel::Dirty 包含。运行 Rails 控制台。运行以下命令。假设 user_details 是 JSONB 列,它的存储访问器是名称。
a = Profile.user_details
a.user_details = { "names" => [{"first_name" => "", "last_name" => "" }] } # This is to replicate what it would look like in a form when a user is submitting a blank entry.
a.changed # This will show that user_details has changed which is correct
a.names = []
a.changed # This will still show that user_details has changed even though it has been set back to its initial state of an empty array. This would work if it was a string field instead of an array.
最佳答案
在 Rails Github 上打开一个问题后,我得到了回复 https://github.com/rails/rails/issues/34537#issuecomment-442265161
更改是通过 json、jsonb、hstore 和序列化属性类型的属性强制执行的。源代码在这里:https://github.com/rails/rails/blob/06ab7b27ea1c1ab357085439abacdb464f6742bf/activerecord/lib/active_record/store.rb#L181
我遇到这个问题的原因是我不再尝试尝试,因为我正在从事的项目不会使用 ActiveModel::Dirty 并且不会尝试跟踪更改的方式我正在尝试这样做。
因此,所有遇到此问题的后代都祝你好运,并随时进入该 github 问题并提示这不起作用。
关于ruby-on-rails - ActiveModel::Dirty 和 JSON 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53490150/
以下是一个非常简单的ruby服务器。 require 'socket' local_socket = Socket.new(:INET, :STREAM) local_addr = Socket.
我正在使用 OS X(使用 bash),并且是 unix 的新手。我想知道是否可以修改一些文件以便运行 ruby 程序,我不需要“ruby file.rb”,而是可以运行“ruby.rb”。 有理
我在用 Ruby 替换字符串时遇到一些问题。 我的原文:人之所为不如兽之所为。 我想替换为:==What== human does is not like ==what== animal does.
我想在一个循环中从 Ruby 脚本做这样的事情: 写一个文件a.rb(每次迭代都会改变) 执行系统(ruby 'a.rb') a.rb 将带有结果的字符串写入文件“results” a.rb 完成并且
我的问题是尝试创建一个本地服务器,以便我可以理解由我的新团队开发的应用程序。我的问题是我使用的是 Ruby 2.3.3,而 Gemfile 需要 2.3.1。我无法编辑 Gemfile,因为我被告知很
我有一个使用 GLI 框架用 Ruby 编写的命令行实用程序。我想在我的主目录中配置我的命令行实用程序,使用 Ruby 本身作为 DSL 来处理它(类似于 Gemfile 或 Rakefile)。 我
我的 Rails 应用 Controller 中有这段代码: def delete object = model.datamapper_class.first(:sourced_id =>
我正在寻找的解析器应该: 对 Ruby 解析友好, 规则设计优雅, 产生用户友好的解析错误, 用户文档的数量应该比计算器示例多, UPD:允许在编写语法时省略可选的空格。 快速解析不是一个重要的特性。
我刚开始使用 Ruby,听说有一种“Ruby 方式”编码。除了 Ruby on Rails 之外,还有哪些项目适合学习并被认可且设计良好? 最佳答案 Prawn被明确地创建为不仅是一个该死的好 PDF
我知道之前有人问过类似的问题,但是我该如何构建一个无需在前面输入“ruby”就可以在终端中运行的 Ruby 文件呢? 这里的最终目标是创建一个命令行工具包类型的东西。现在,为了执行我希望用户能够执行的
例如哈希a是{:name=>'mike',:age=>27,:gender=>'male'}哈希 b 是 {:name=>'mike'} 我想知道是否有更好的方法来判断 b 哈希是否在 a 哈希内,而
我是一名决定学习 Ruby 和 Ruby on Rails 的 ASP.NET MVC 开发人员。我已经有所了解并在 RoR 上创建了一个网站。在 ASP.NET MVC 上开发,我一直使用三层架构:
最近我看到 Gary Bernhardt 展示了他用来在 vim 中执行 Ruby 代码的 vim 快捷方式。捷径是 :map ,t :w\|:!ruby %. 似乎这个方法总是执行系统 Rub
在为 this question about Blue Ruby 选择的答案中,查克说: All of the current Ruby implementations are compiled to
我有一个 Ruby 数组 > list = Request.find_all_by_artist("Metallica").map(&:song) => ["Nothing else Matters"
我在四舍五入时遇到问题。我有一个 float ,我想将其四舍五入到小数点后的百分之一。但是,我只能使用 .round ,它基本上将它变成一个 int,意思是 2.34.round # => 2. 有没
我使用 ruby on rails 编写了一个小型 Web 应用程序,它的主要目的是上传、存储和显示来自 xml(文件最多几 MB)文件的结果。运行大约 2 个月后,我注意到 mongrel 进程
我们如何用 Ruby 转换像这样的字符串: 𝑙𝑎𝑡𝑜𝑟𝑟𝑒 收件人: Latorre 最佳答案 s = "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" => "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" s.u
通过 ruby monk 时,他们偶尔会从左侧字段中抛出一段语法不熟悉的代码: def compute(xyz) return nil unless xyz xyz.map {|a,
不确定我做错了什么,但我似乎弄错了。 问题是,给你一串空格分隔的数字,你必须返回最大和最小的数字。 注意:所有数字都是有效的 Int32,不需要验证它们。输入字符串中始终至少有一个数字。输出字符串必须
我是一名优秀的程序员,十分优秀!