Ben Densmore

Joined

950 Experience
9 Lessons Completed
0 Questions Solved

Activity

Posted in Issue with Hash Serialization during update

Hi all,
I am working on fixing an issue that came up in our app and have been struggling to nail this one down.

I have a Company model that is a one to one with a FileCompleteness model so I have


class Company < ApplicationRecord
  has_one :file_completenes
end

class FileCompleteness < ApplicationRecord
  belongs_to :company
end

I have an attribute on my FileCompleteness model called "custom_documents" that is setup as text column and is set to

serialize :custom_documents, Hash

The way it's stored in the database is like:

cd_document_1:
name: "Custom Document"
required: 0

The initial bug I ran into is that when the update action runs, it's looking for an attribute called "cd_document_1" which doesn't exist because that is stored in the "custom_documents" column but the form that has the checkbox to toggle the required attribute was being stored with the name "cd_document_1" or whatever custom name is given to that document.

So in the form, I changed it to use the fields_for helper which now kind of works, but I'm running into 2 issues.

Form looks like:

<%= f.fields_for :file_completeness do |setting| %>
     <%= setting.fields_for :custom_documents do |cd| %>
       <%= cd.fields_for field  do |fd| %>
         <%= fd.hidden_field :name,  value: file_completeness.custom_documents[field.to_s]&.fetch(:name) %>
          <%= fd.smarty_on_off_switch(:required) %>
    <% end %>
  <% end %>
<% end %>

If I look at the checkbox in dev tools the form field name is the following:

company[file_completeness_attributes][custom_documents][cd_document_1][required]
  1. The data is going from looking like:

cd_document_1:
name: Custom Document
required: 0

To:

-- !ruby/hash:ActiveSupport::HashWithIndifferentAccess
cd_document_1: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
name: Custom Document
required: '1'

And the other issue is that the required attribute is being turned into a string rather than a boolean.

Does anyone have suggestions on how I can make this behave as intended?

Thank you,
Ben

Screencast tutorials to help you learn Ruby on Rails, Javascript, Hotwire, Turbo, Stimulus.js, PostgreSQL, MySQL, Ubuntu, and more.

© 2024 GoRails, LLC. All rights reserved.