Я столкнулся с подобной проблемой, пытаясь использовать simple_fields_for
для типа поля Hash модели Mongoid. Mongoid версия вашего примера, с которой я имел дело, выглядела так:
class Page
include Mongoid::Document
field :fields, type: Hash
end
Моя ситуация может немного отличаться, хотя, поскольку я уже знаю хеш-ключи, которые я ищу заранее, мне просто нужно simple_fields_for
для работы с хеш-полем. Наивный метод (базовое fields_for
использование), который я использовал, выглядел так:
= simple_form_for(@page) do |f|
= f.simple_fields_for :fields do |ff|
= ff.input :address
= ff.input :founded
Но это не заполняло форму должным образом. Решение nicholaides об обёртывании хеша в структуру сработало для меня:
- 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
Чтобы избежать необходимости смешивать OpenStruct с моим представлением, я создал обезьянький патч для simple_form
, чтобы автоматически оборачивать типы хешей в OpenStruct и помещать в инициализатор:
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
И теперь я могу использовать свое оригинальное наивное решение без специального кода вида.