hashWithIndifferentAccess阻止从表单更新单个哈希值

时间:2018-12-05 19:22:04

标签: ruby-on-rails forms hash sql-update

当前,我正在尝试在我称为:section_text

的哈希中更新单个键“ elementOne”的值。

哈希看起来像这样:

section_text => {"elementOne" => "words", "elementTwo" => "other words"}

这是我的模特:

 class DynamicElement < ApplicationRecord
  has_many :dynamic_page_elements
  has_many :dynamic_pages, :through => :dynamic_page_elements
  store :section_text, accessors: [ :elementOne, :elementTwo ]
 end

我的表单文本区域:

 <%= form.text_area :elementOne, value: dynamic_element.section_text["elementOne"] %>
   <div class="actions">
 <%= form.submit %>

强大的参数

  def dynamic_element_params
    params.require(:dynamic_element).permit(:style, :description, :section_text, :elementOne)
  end

当我运行更新(从“ Birthday Gifts !!!”到“ Birthday Gifts !!!?”)时,参数完全显示了我的期望,并且当SQL代码开始运行时,它甚至开始替换有关的确切键值对。

但是,正如您所看到的,在密钥后面附加了“ ---!ruby / hash:ActiveSupport :: HashWithIndifferentAccess”,这阻止了更新的进行,更不用说它不是我最初想要的格式了。

********终端图片下方*********

Terminal Output

如何防止这种情况,以便可以按原样保存新值? 我做了一些阅读,从发现的结果看,似乎是Rails正在通过默认的序列化程序YAML对其进行序列化?

这时有些迷失,不胜感激! (使用postgresql)

编辑 我什至在这里走这条路的最佳途径吗?

1 个答案:

答案 0 :(得分:0)

您正在寻找的可能是:

elem = DynamicElement.joins(:dynamic_page_elements).find_by!(
  dynamic_page_elements: params.slice(:dynamic_page_id),
  description: "SectionOne",
)
new_section_text = elem.section_text.merge(dynamic_element_params)
elem.update(section_text: new_section_text)

一些提示:

  • 利用数据库联接来避免nil -它们是错误的常见来源,并导致您的代码为"timid"
  • 默认情况下避免突变(merge!,使更改保持离散并易于跟踪
  • 使用良好的命名来跟踪您要处理的概念
    • 例如不清楚element.update(derp)在做什么