hashWithIndifferentAccess предотвращает обновление одного значения хеша из формы - PullRequest
0 голосов
/ 05 декабря 2018

В настоящее время я пытаюсь обновить значение одного ключа, "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

Когда я запускаю обновление (из "Подарки на день рождения !!!""to" Подарки на день рождения !!!? ") параметры показывают именно то, что я ожидаю, и когда код SQL начинает выполняться, он даже начинает заменять конкретную пару ключ-значение в вопросе.

НО, как вы можете видеть, "---! Ruby / hash: ActiveSupport :: HashWithIndifferentAccess" добавлен к ключу, который препятствует продвижению обновления, не говоря уже о том, что он не был в том формате, в котором я изначально былсобирается.

******** ТЕРМИНАЛ PIC НИЖЕ *********

Клеммный выход

Какя могу предотвратить это, чтобы сохранить новое значение как есть?Я кое-что прочитал, и из того, что я обнаружил, похоже, что rails сериализует это через сериализатор по умолчанию, YAML?

Немного потеряно на этом этапе, любая помощь очень ценится!(используя postgresql)

РЕДАКТИРОВАТЬ Я даже иду по лучшему пути здесь, чтобы выполнить это?

1 Ответ

0 голосов
/ 06 декабря 2018

то, что вы ищете, вероятно:

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)

Несколько советов:

  • используйте соединения db, чтобы избежать nil s - ониобщий источник ошибок и приводит к тому, что ваш код "робкий"
  • по умолчанию избегает мутирования (merge!), сохраняет изменения дискретными и их легче отслеживать
  • использовать хорошонаименование, чтобы отслеживать концепции, с которыми вы работаете
    • например, неясно, что делал element.update(derp)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...