【问题标题】:hashWithIndifferentAccess is preventing update of a single hash value from a formhashWithIndifferentAccess 阻止更新表单中的单个哈希值
【发布时间】:2018-12-05 19:22:04
【问题描述】:

目前我正在尝试在我调用的哈希中更新单个键“elementOne”的值:section_text

哈希看起来像这样:

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

当我运行更新(从“生日礼物!!!”到“生日礼物!!!?”)时,参数准确地显示了我的期望,当 SQL 代码开始运行时,它甚至开始替换有问题的确切键值对。

但是,如您所见,“--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess”已附加到阻止更新继续进行的键中,更不用说它不是我最初想要的格式。

************下面的终端图片*********

Terminal Output

如何防止这种情况,以便我可以按原样保存新值? 我做了一些阅读,从我发现听起来好像 rails 正在通过默认序列化程序 YAML 序列化它?

此时有点迷茫,非常感谢任何帮助! (使用 postgresql)

编辑 我什至要走上最好的道路来实现这一点吗?

【问题讨论】:

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


    【解决方案1】:

    您正在寻找的可能是:

    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)
    

    一些提示:

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

    【讨论】:

    • 感谢您的回答,实际上我只需将 store :section_text, accessors: [ :elementOne, :elementTwo ] 更改为 store_accessor :section_text, :elementOne, :elementTwo
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    相关资源
    最近更新 更多