表单对象缺少映射的Simple_form

时间:2019-03-08 18:14:31

标签: ruby-on-rails ruby-on-rails-5.2 simple-form-for

我正在使用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

这些都没有显示,我可以创建自定义映射。

如何允许Simple_form查看我的列类型并正常工作?

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

1 个答案:

答案 0 :(得分:2)

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 Attribute 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一起使用。该答案仅说明了如何处理输入映射推断