Serialized Hash field and Simple Form

后端 未结 4 1128
不思量自难忘°
不思量自难忘° 2020-12-09 19:39

I have the following.

class Page < ActiveRecord::Base
  belongs_to :category
  serialize :fields
end

The value of fields wi

相关标签:
4条回答
  • 2020-12-09 20:21

    Use OpenStruct. It works like this:

    require 'ostruct'
    
    struct = OStruct.new("address" => "8 finance street, hong kong", "founded" => "1973")
    struct.address # => 8
    struct.founded # => "1973"
    
    0 讨论(0)
  • 2020-12-09 20:24

    I ran into a similar issue trying to use simple_fields_for on a Hash field type of a Mongoid model. The Mongoid version of your example I was dealing with looked like this:

    class Page
      include Mongoid::Document
      field :fields, type: Hash
    end
    

    My situation might be slightly different though, as I already know the hash keys I am looking for ahead of time, and just needed simple_fields_for to work with the hash field. The naive method (basic fields_for usage) I was using looked like this:

    = simple_form_for(@page) do |f|
      = f.simple_fields_for :fields do |ff|
        = ff.input :address
        = ff.input :founded
    

    But that wasn't populating the form properly. nicholaides's solution of wrapping the hash in a struct worked for me:

    - require 'ostruct'
    = simple_form_for(@page) do |f|
      = f.simple_fields_for :fields, OpenStruct.new(@page.fields) do |ff|
        = ff.input :address
        = ff.input :founded
    

    To avoid having to mix the OpenStruct stuff into my view, I created a monkey patch for simple_form to automatically wrap hash types in an OpenStruct and put it into an initializer:

    require 'ostruct'
    
    module SimpleForm::ActionViewExtensions::Builder
      def simple_fields_for_with_hash_support(*args, &block)
        if args[0] && !args[1]
          field = object.send(args[0])
          args << OpenStruct.new(field) if field.respond_to?(:has_key?)
        end
        simple_fields_for_without_hash_support(*args, &block)
      end
      alias simple_fields_for_without_hash_support simple_fields_for
      alias simple_fields_for simple_fields_for_with_hash_support
    end
    

    And now I can use my original naive solution without special view code.

    0 讨论(0)
  • 2020-12-09 20:28

    Here is a solution you could easily adapt to your problem :

    https://gist.github.com/2157877

    Keeps the form super-clean and keeps the normal behaviour of an active model (nothing to add in your controller).

    Cheers !

    0 讨论(0)
  • 2020-12-09 20:37

    If only I´ve found this post earlier I would not have missed three days on this issue.

    I was not able to comment on the answear so just to add, if anyone trying to fields_for a mongo array of hashes (has_many like) additionally you will need to supply the root OpenStruct object with a "#{key}_attributes=" (in this case fields_attributes=) method so fields_for would identify it is a has_many relation.

    Hope it helps someone ;)

    0 讨论(0)
提交回复
热议问题