Simple_form 表单对象缺少映射

Simple_form with Form Object missing Mapping

我正在使用 simple_form_for

<%= simple_form_for( @form_object, url: wizard_path, :method => :put) do |f| %>
    <%= f.input :website %>
    <%= f.submit %>
  </div>
<% end %>

不过,我也在使用表单对象

  class Base
    include ActiveModel::Model
    # Validations
    # Delegations
    # Initializer
   end

我的问题是我的输入没有映射到我的数据库列,所以 https://github.com/plataformatec/simple_form#available-input-types-and-defaults-for-each-column-type

None 出现了,我可以创建自定义映射吗?

如何让 Simple_form 看到我的列类型并正常工作?

如果我检查我的委托字段的 class,它们似乎显示为 :string 或 :integer 等

simple_form 使用 2 种方法从标准模型(type_for_attributehas_attribute?)确定输入类型字段映射。 Source

由于您将模型包装在另一层中,但仍需要 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

但是,如果您没有包装模型,则需要自己定义这些方法,例如(使用新的 rails 5.2 属性 API)

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 一起使用。这个答案简单地解释了如何处理输入映射推断