simple_form
использует 2 метода для определения отображения поля типа ввода из стандартной модели (type_for_attribute
и has_attribute?
). Источник
Поскольку вы оборачиваете модель в другой слой, но по-прежнему хотите сделать вывод, который simple_form
предоставляет, вам просто нужно делегировать эти вызовы исходной модели через
class Wrapper
include ActiveModel::Model
attr_reader :model
delegate :type_for_attribute, :has_attribute?, to: :model
def initialize(model)
@model = model
end
end
Однако, если бы вы не обернули модель, вам нужно было бы определить эти методы самостоятельно, например (используя новый API атрибутов rails 5.2)
class NonWrapper
include ActiveModel::Model
include ActiveModel::Attributes
attribute :name, :string
def type_for_attribute(name)
self.class.attribute_types[name]
end
def has_attribute?(name)
attributes.key?(name.to_s)
end
end
Пример
a = NonWrapper.new(name: 'engineersmnky')
a.has_attribute?(:name)
#=> true
a.type_for_attribute(:name)
#=> => #<ActiveModel::Type::Value:0x00007fffcdeda790 @precision=nil, @scale=nil, @limit=nil>
Примечание могут потребоваться другие дополнения для объекта формы, подобного этому, для работы с simple_form. Этот ответ просто объясняет, как обрабатывать вывод входного отображения